C语言当中的结构体内存对齐基本上是笔试中必考的问题,一般都是给你一个结构体,问你这个结构体占用多少个字节。今天就来深入分析一下可能涉及到的各种情况。 首先来说一下结构体的对齐规则。 一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则,有宏定义的情况下结构体的自身宽度就是宏...
偏移对齐是指:一个结构体成员相对于结构体起始地址的偏移量所应该进行的对齐。可以理解为,假设结构体的起始地址为0x0,每个成员的起始地址都要求满足自然对齐。当成员不满足偏移对齐原则时,编译器会自动在结构体成员之间进行数据填充。 尾部对齐是指:在结构体的内部成员起始地址满足偏移对齐后,还需要保证结构体的大小为...
1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。 2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。 3) 指定对齐值:#pragma pack (value)时的指定对齐值value。 4) 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中...
猜测:两个结构体里面都是两个char,一个int,那他们的内存大小应该一样吧 但是,输出结果👇🏻 很显然,尽管这两个结构体变量的成员差不多,但是这两个结构体变量的大小却不一样。 这就是因为结构体类型的变量在开辟内存的时候,要遵循结构体内存对齐,只有对齐到符合的地址处时,才会开始为成员分配内存 在了解如何...
当我们在C语言中定义结构体时,编译器会对结构体的成员进行内存对齐,以提高访问效率和节约内存。如果没有对齐的话,CPU在取数的时候,会花更多的指令周期。 一个32位系统,假设有个整型变量的地址不是自然对齐,比如为0x00000002,则CPU取它的值需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取...
为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”。比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除。 1.2 为什么需要字节对齐 当我们在C语言中定义结构体时,编译器会对结构体的成员进行内存对齐,以提高访问效率和节约内存。如果没有对齐的话,CPU在取...
假设有一个结构体如下: c struct MyStruct { char a; int b; char c; }; 按照默认对齐规则,成员a从偏移量0开始,占用1个字节;成员b需要从4的倍数偏移量开始(因为int是4个字节),所以b会从偏移量4开始,占用4个字节;成员c则从偏移量8开始,占用1个字节。因此,整个结构体的总大小为9个字节,但由于需要...
结构体总大小为最大对齐数(结构体中的每一个成员都有一个对齐数,所有对齐数中的)的整数倍。2 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。● 来代码理解: C 复制代码 99 1 2 3...
结构体大小为 18 字节,结构体内包含最大成员占用 8 字节,所以还需要在最后补充 6 字节,共 24 字节 打印出的结构体大小和各成员内存地址如下: struct_b size 24 a addr:008726F8 b:00872700 c addr:00872708 addr:00872709 对齐方法02.jpg 使用#pragma pack宏声明 ...
默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不使用预编译指令#pragma pack,采用默认字节对齐方式。