#include<stdio.h>// 默认对齐数#pragmapack(1)// 定义一个结构体struct Student{char name[20];int age;float score;};intmain(){printf("Size of struct Student: %lu bytes\\n",sizeof(struct Student));// 恢复默认对齐数#pragmapack()// 修改对齐数为4#pragmapack(4)struct Student s;printf("S...
C语言的struct成员对齐与操作系统有关,在window与linux上的表现不同,先来看一个例子: 1#include <stdio.h>2typedefstruct{3intnum1;4intnum2;5doublenum3;67}A;8typedefstruct{9intnum1;10doublenum3;11intnum2;12}B;1314intmain(void) {15printf("A:%d\n",sizeof(A));16printf("B:%d\n",sizeo...
structMyStruct{inta;int*b; };structMyStruct1{inta;structMyStructb; }; MyStruct:结构体大小是16(64位系统),a占用4,填充4,b是指针,占用8 MyStruct1:结构体大小是24,a占用4,填充4,b占用16 看到上面这些例子,可能有点懵了,不过数据对齐是有规则的: 结构体中第一个变量起始偏移量是0 结构体中的其他变...
具体来说,它可以用来修改结构体或联合体中成员的偏移量对齐数,以及整个结构体或联合体的总大小对齐数。使用#pragma pack(n)时,n 指定了新的对齐字节数。结构体的成员将按照 n 字节对齐,同时整个结构体的总大小也将按照 n 字节对齐。 #include <stdio.h> struct C{ char a[3]; // 3 bytes int b; //...
结构体的对齐是指其中的每个数据成员都是自然对齐的,要达到这个效果可能需要在成员之间进行必要的字节填充。比如一下struct: struct DemoStruct { char c1; // 1B uint64_t n1; // 8B }; 在默认情况下需要在c1后面填充7个字节,才能保证n1是自然对齐的。此时sizeof(DemoStruct)==16 C/C++ struct通常的对齐...
struct test{char a;//1short b;//2char c;//1}; 如果你觉得是4个,那就错了。答案是6个。 来结合对齐规则来看一下,1、第一个成员首地址为0(准确说是偏移量),这个没什么好说,2、每个成员的首地址是自身大小的整数倍,因为b是short类型的,占用两个字节,所以,必须以2字节对齐,也就是说你可以把b放在...
#pragma可以编辑默认对齐数 #include <stdio.h>struct Test1{ int i; //4};struct Test2{ int i; //8 double j; //8};struct Test3{ int i; //4 char c; //4};struct Test4{ int i; // 4+4 =8 struct Test5{ double d1; //8 double d2; //8}t;};#pragma pack(1)struct Test...
typedef struct ms2 { int a; char b; } MS2; 或许你认为MS2比MS1的情况要简单,它的布局应该就是 ___ | | | | a | b | | | | +---+ Bytes: 4 1 因为MS2对象同样要满足4字节对齐规定,而此时a的地址与结构体的首地址相等,所以它一定也是4字节对齐。嗯,分析得有道理,可是却不全面。让我们来...
3.内存对齐规则【重点】 思考下面的示例代码,结构体A和结构体B中的成员类型完全一样,但它们分别占用的内存空间大小却不一样。 #include <iostream> using namespace std; struct A{ char a; int b; short c; }; struct B{ short c; char a; ...
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比 较小的那个进行。 2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#...