广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++结构体字节对齐和共用体大小的示例分析
  • 455
分享到

C++结构体字节对齐和共用体大小的示例分析

2023-06-25 14:06:02 455人浏览 薄情痞子
摘要

这篇文章主要介绍了c++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、结构体内存对齐结构体内存对齐在笔试和面试中经常被问到,所以做个总

这篇文章主要介绍了c++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1、结构体内存对齐

结构体内存对齐在笔试和面试中经常被问到,所以做个总结

通过代码验证不同结构体的内存大小:

#include <stdio.h>struct node1{    char c1;    int val1;    char c2;};struct Node2{    char c1;    char c2;    int val1;};struct Node3{    char c1;    char array[10];};struct Node4{    char val1;    int arrar[10];};int main(){    printf("Node1 size = %d\n",sizeof(struct Node1));    printf("Node2 size = %d\n",sizeof(struct Node2));    printf("Node3 size = %d\n",sizeof(struct Node3));    printf("Node4 size = %d\n",sizeof(struct Node4));    return 0;}

代码运行结果为:

C++结构体字节对齐和共用体大小的示例分析

通过上述代码运行结果可以发现Node1Node2定义了相同个数的变量,但是Node1的大小为12,Node2的大小为8,这是为什么呢?

这里首先明确两个概念:对齐数和最大对齐数,在结构体中对齐数就是每个成员类型的大小,如Node1中,对齐数为{1,4,1},在数组中,对齐数不是数组的大小,而是数组成员的大小,所以Node3的对齐数为{1,1},Node4的对齐数为{1,4}。最大对齐数是对齐数中的最大值(GCc编译器),最大对齐数可能受编译器的影响,通常编译器会有编译器对齐数,最大对齐数应该是编译器对齐数和结构体最大对齐数中较小值,如VS编译器对齐数为8,如果结构体的最大对齐数为16,那么计算结构体的最大对齐数应该为8。我的编译器为gcc,所以最大对齐数为结构体对齐数中的最大值。

知道最大对齐数后,就可以计算结构体的大小了,需要明确结构体的大小一定是最大对齐数的整数倍。那么Node1和Node2的成员类型是一样的,为什么Node1的大小为12字节,Node2的大小为8字节呢。这是因为结构体内存的连续性,在存储容量没有到最大对齐数的内存大小时,只要能够保存这个成员,结构体就会将该成员变量保存在一个最大对齐树的内存空间内。这样就避免了内存的过度浪费。

所以,上述各结构体的内存大小计算方式如下:

  • sizeof(Node1)= 1 + 3(浪费)+ 4 + 1 + 3(浪费) = 12

  • sizeof(Node2)= 1 + 1 + 2(浪费)+ 4 = 8

  • sizeof(Node3) = 1 + 1 * 10 = 11

  • sizeof(Node4) = 1 + 3(浪费)+ 4 * 10 = 44

那么结构体嵌套结构体的大小应该怎么计算呢?举以下例子:

#include <stdio.h>struct Node1{    char c1;    int val1;    char c2;};struct Node2{    char c1;    struct Node1 node;    double val1;};int main(){    printf("Node1 size = %d\n",sizeof(struct Node1));    printf("Node2 size = %d\n",sizeof(struct Node2));    return 0;}

代码运行的结果为:

 可以明确,嵌套结构体的对齐数为所嵌套结构体的最大对齐数,所以Node1的对齐数为{1,4,1},Node2的对齐数为{1,4,8},最大对齐数分别为4和8,则代码里两个结构体的大小计算方式为:

  • sizeof(Node1)= 1 + 3(浪费)+ 4 + 1 + 3(浪费) = 12

  • sizeof(Node2)= 1 + 7(浪费)+ 12 + 4(浪费)+ 8 = 24

2、共用体的内存大小

对于以下共用体,读取它大小的代码如下:

#include <stdio.h>uNIOn un1{    int val;    char c;    double d;};union un2{    int val;    char array[5];};int main(){    printf("un1 size = %d\n",sizeof(union un1));    printf("un2 size = %d\n",sizeof(union un2));    return 0;}

代码运行结果为:

C++结构体字节对齐和共用体大小的示例分析

 共用体之所以叫共用体,就是因为它的成员变量共享内存,既然共享内存,那么共用体占用的内存空间一定要可以保存内存最大的成员类型,而un1的最大内存成员为double型,大小为8字节,所以un1的大小为8字节,那么un2的内存大小为什么不是5呢?这是因为要内存对齐,共用体也遵循内存对齐原则,un2的最大对齐数是4,因此un2的大小应该是4的整数倍数,所以,sizeof(un2)= 8.

3、枚举的大小

这里顺带提一下枚举的内存大小,代码验证如下:

#include <stdio.h>enum Colour {    RED,    GREEN,    BLUE};enum ProgramLanguage {    python = 0xffffffffff,    c = 8,    java};int main(){    printf("Colour size = %d\n",sizeof(enum Colour));    printf("ProgramLanguage size = %d\n",sizeof(enum ProgramLanguage));    return 0;}

代码运行结果为:

C++结构体字节对齐和共用体大小的示例分析

 可见枚举类型的大小是编译器根据定义的值自行给定的,实际使用中很少会超出4字节大小。

感谢你能够认真阅读完这篇文章,希望小编分享的“C++结构体字节对齐和共用体大小的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: C++结构体字节对齐和共用体大小的示例分析

本文链接: https://www.lsjlt.com/news/305436.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++结构体字节对齐和共用体大小的示例分析
    这篇文章主要介绍了C++结构体字节对齐和共用体大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、结构体内存对齐结构体内存对齐在笔试和面试中经常被问到,所以做个总...
    99+
    2023-06-25
  • C++结构体字节对齐和共用体大小
    目录1、结构体内存对齐2、共用体的内存大小3、枚举的大小1、结构体内存对齐 结构体内存对齐在笔试和面试中经常被问到,所以做个总结 通过代码验证不同结构体的内存大小: #inclu...
    99+
    2022-11-12
  • C++结构体字节对齐示例
    目录示例代码不想让结构体自动对齐怎么办示例代码 #include <iostream> //输入输出流 using namespace std; #include ...
    99+
    2022-11-13
  • C语言结构体字节对齐的实现深入分析
    目录前言一、什么是字节对齐二、结构体字节对齐三、#pragma pack()的使用总结前言 本教程可能会用到一点汇编的知识,看不懂没关系,知道是那个意思就行了。使用的工具是vs201...
    99+
    2022-11-13
    C语言结构体字节对齐 C语言字节对齐
  • C语言中结构体和共用体的示例分析
    这篇文章给大家分享的是有关C语言中结构体和共用体的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、实验目的掌握结构体类型变量的定义和使用;掌握结构体类型数组的概念和应用;掌握链表的概念,初步学会对链表进...
    99+
    2023-06-20
  • C语言中使用结构体计算内存占用的示例分析
    小编给大家分享一下C语言中使用结构体计算内存占用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!    c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(c...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作