今天看到一个求结构体偏移量的题目,可以使用宏来求解,觉得很是新奇,继续深入考虑到结构体字节对齐问题。参考网上的内容,对齐的规则有如下两条:
- 第一个数据成员从offset=0的地址开始放,以后的数据成员存放的起始位置要么为本数据大小的整数倍要么为其体内所含子成员大小的整数倍。
- 结构体的sizeof得到的大小肯定为其内部最大成员的大小的整数倍;
- 网上有说结构体内有子结构体时,子结构体的开始位置应该为其内部最大数据成员大小的整数倍,经实验,不符合此条。
- 同时可以使用#pragma pack(n),来改变对齐的大小,一般都设置为1,2,4。默认的值和机器字长有关。
1 #include <string> 2 #include <iostream> 3 //#pragma pack(1) 4 #define FIND(type, member) (size_t)&(((type*)0)->member) 5 using namespace std; 6 struct aa{ 7 int a; 8 char b; 9 double c; 10 }; 11 12 struct Node{ 13 char a; 14 int ia; 15 double da; 16 char b; 17 char c; 18 aa sa; 19 }; 20 int main(int argc, char* argv[]){ 21 cout << FIND(struct Node, a) << endl; 22 cout << FIND(struct Node, ia)<< endl; 23 24 cout << FIND(struct Node, da)<< endl; 25 cout << FIND(struct Node, b)<< endl; 26 cout << FIND(struct Node, c)<< endl; 27 cout << "sa" << FIND(struct Node, sa)<< endl; 28 cout << "sizeof(double):" << sizeof(double) << endl; 29 cout << "sizeof(aa):" << sizeof(aa) << endl; 30 cout << "sizeof(Node):" << sizeof(Node) << endl; 31 32 cout << "---------------------------------------"; 33 Node *p = new Node; 34 cout << "&p:" << (int*)p << endl; 35 cout << "&p->a:" <<(int*)&(p->ia) << endl; 36 37 }