C++ 内存对齐问题

排山和倒海 2014-10-28 06:32:39
struct P1{
int a;
char b;
int c;
char d;
};
struct P2{
struct P1 a[2];
struct P1 * b;
};

这个代码的P2的结构体的sizeof的大小是36,也就是说P2结构体的对齐的字长是4个字节
但是,我个人记得struct结构体的字长根据最大的结构体元素进行设置的,也就是最长的结构体进行对齐,那以我的理解,P2的对齐的字长应该是P1(16)的长度啊。。。
然后,现在我又知道结构体的对齐的字长是根据基本数据结构进行对齐的,也就是 char short int double,那这里为什么选择4呢,我知道struct P1*是指针,指针是4个字节,但是如果按基本数据类型,同时考虑P2的第一个元素大小太大,他不应该是选择最大的基本数据类型的大小么?
如果是
struct P1{
double a;
char b;
};

这个的大小是16,也就是选择了duoble。。。
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2014-10-29
  • 打赏
  • 举报
回复
不要猜了, 很有可能根编译器设置有关. 一般默认是4字节对齐. 当然, 你可以强制指定1,2,4字节等对齐方式 请搜索: 内存对齐规则 内存对齐的规则以及作用
排山和倒海 2014-10-28
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
只是一个指针大小而已,需要自己分配的!
我现在似乎明白了,其实我发现我的问题可以归结为这样子
struct p1{
   int a;
}
struct p2{
    struct p1 a;
}
struct p3{
    struct p2 a;
}
不论嵌套多少,最终p3的对齐的字节大小是有所有的元素中最基本元素的最大值决定的。 如果p1中有double ,那么p3的对齐的字节是8,取最大的那一个。
罗博士 2014-10-28
  • 打赏
  • 举报
回复
结构体里的结构体,按照其最大的成员对其,而不是按自身的字节数对其。
勤奋的小游侠 2014-10-28
  • 打赏
  • 举报
回复
然后,现在我又知道结构体的对齐的字长是根据基本数据结构进行对齐的,也就是 char short int double,那这里为什么选择4呢,为什么选4?这个4是结构体中用到的基本类型的最大值,里面没有用到double,最大值只用到int。所以是4 struct P1{ int a; //4 char b;//1,对齐到4 int c; //4 char d;//1,对齐到4 };//所以是16 struct P2{ struct P1 a[2]; //16*2 =32 struct P1 * b;//4 };32+4=36 struct P1{ double a;//8 char b;//1对齐到8 };16 struct P2{ struct P1 a[2];//16*2=32 struct P1 * b;//4,对齐到P1中的double,所以是8 };32+8=40 你有什么问题?
max_min_ 2014-10-28
  • 打赏
  • 举报
回复
只是一个指针大小而已,需要自己分配的!

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧