#include <stdio.h> // 默认对齐 struct DefaultAlign { char a; // 1字节 int b; // 4字节 short c; // 2字节 }; // 使用#pragma pack(1)进行对齐 #pragma pack(1) struct PackedAlign { char a; // 1字节 int b; // 4字节 short c; // 2字节 }; #pragma pack() int main...
拿一个很简单的结构体align1为例 1 struct align1 2 { 3 char a; 4 int b; 5 char c; 6 } sim[2]; 如果不考虑任何对齐问题,只考虑结构体中每个成员应该占用的大小,很显然每个结构align1定义的变量是1(char)+4(int)+1(char)共6个字节。但是实际上(至少在windows上)它占用了12个字节,原因就在于它...
第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足; 第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。 各种类型的变量的align值如下,参考的是wikipedia的页面:...
struct Foo{ char c;short ns;};int main(){ struct Foo foo;printf("struct size : %d\n",sizeof(foo));printf("struct align : %d\n", alignof(struct Foo));printf("foo addr : %#X\n",&foo);printf("foo.c addr : %#X\n",&foo.c);printf("foo.ns addr : %#X\n",&foo.ns);...
现在回到我们关心的struct上来。ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。嗯?填充区?对,这就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那...
struct SIMPLE x; struct SIMPLE y[20],*z; 1. 2. 为结构体变量重命名 typedef struct{ int a; int b; int c; }Simple; Simple x; Simple y[20],*z; 1. 2. 3. 4. 5. 结构成员 结构成员可以是标量、数组、指针甚至是其他结构。
struct align_basic { char c; int i; double d; }; 那么此时sizeof(align_basic)的值会是sizeof(char)+sizeof(int)+sizeof(double)的值么? 如上图经过测试我们发现其大小为16个字节并不等于1+4+8=13个字节,可知编译器给align_basic结构体插入了另外3个字节,接下来我们将分析编译器对齐字节的规则以及...
如上图,元素实际仅需要57 Byte空间,由于数据对齐(Align = 4 Byte),变量AoTeMan实际消耗了60 Byte字节空间。 上图我们可以看出:结构体变量元素的内存空间连续排布,因此,各个元素相对起始地址会存在偏移。 工程上如何计算每个元素相对起始位置的偏移呢?计算偏移又有什么用处呢?
struct AlignData{ char a; char d; short b; int c; }; 那么编译后不用填充字节就能保持所有的成员都按各自默认的地址对齐。这样可以节约不少内存!一般的结构体成员按照默认对齐字节数递增或是递减的顺序排放,会使总的填充字节数最少。基本数据类型数组在内存中的布局并不是每个数组的元素都是按照4字节对齐的...
例子:__align(),__attribute((aligned (n))),#pragma pack(n) #include <stdio.h>main() {structA {inta;charb;shortc; };structB {charb;inta;shortc; };#pragmapack (2) /*指定按2字节对齐*/structC {charb;inta;shortc; };#pragmapack () /*取消指定对齐,恢复缺省对齐*/#pragmapack (1...