class内存对齐问题 (class中成员变量顺序改变)

times_garden 2010-10-27 10:50:22
#include <iostream>
using namespace std;
#pragma pack (8)
class Basic{
public:
char c;
char a;
int b;
double d;
};

int main(){
cout<<"Size of class:"<<sizeof(Basic);
}
#pragma pack ()
这个程序结果是16.

#include <iostream>
using namespace std;
#pragma pack (8)
class Basic{
public:
char a;
int b;
char c;
double d;
};

int main(){
cout<<"Size of class:"<<sizeof(Basic);
}
#pragma pack ()
而这个程序的结果却是24.

这是为什么呢??

...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aoxixiaojun 2010-10-29
  • 打赏
  • 举报
回复
learning
翅膀又硬了 2010-10-29
  • 打赏
  • 举报
回复
学习[Quote=引用 6 楼 qq120848369 的回复:]
引用 5 楼 qq120848369 的回复:
char<8,按1字节对齐,所以位于位置0,保持地址被0整除
int<8,按4字节对齐,所以位于位置4,占有4,5,6,7,保持起始地址被4整除
char<8,按1字节对其,所以位于位置8,保持起始地址被1整除
double==8,按8字节对其,所以只能位于位置16,占有16,17,18,19,20,21,22,23,共8个字节。

所以……
[/Quote]
gules 2010-10-29
  • 打赏
  • 举报
回复
记住1,2,4,8原则,因为处理器寻址时的伸缩因子就是1,2,4,8。
qq120848369 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]
char<8,按1字节对齐,所以位于位置0,保持地址被0整除
int<8,按4字节对齐,所以位于位置4,占有4,5,6,7,保持起始地址被4整除
char<8,按1字节对其,所以位于位置8,保持起始地址被1整除
double==8,按8字节对其,所以只能位于位置16,占有16,17,18,19,20,21,22,23,共8个字节。

所以总共地址跨度为0.。23,为24字节。
[/Quote]

补充,最后得到最终占有24字节时,必须选出#pragma定制的n与结构体最大的变量中较小者,然后将整个结构体填充整齐为其倍数,这里是8,所以24个字节就对齐了。
qq120848369 2010-10-27
  • 打赏
  • 举报
回复
char<8,按1字节对齐,所以位于位置0,保持地址被0整除
int<8,按4字节对齐,所以位于位置4,占有4,5,6,7,保持起始地址被4整除
char<8,按1字节对其,所以位于位置8,保持起始地址被1整除
double==8,按8字节对其,所以只能位于位置16,占有16,17,18,19,20,21,22,23,共8个字节。

所以总共地址跨度为0.。23,为24字节。
無_1024 2010-10-27
  • 打赏
  • 举报
回复
因为有#pragma pack (8)标明当前内存对齐字节为8位
所以每行有8个小内存 char为 1位 int 四位 double 8位
所以有内存对齐是取最长长的排布
内存分布为
第一个
cccc cccc aaaa aaaa aaaa aaaa 0000 0000
bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb
一共16位
第二个
aaaa bbbb bbbb bbbb bbbb 0000 0000 0000
cccc 0000 0000 0000 0000 0000 0000 0000
dddd dddd dddd dddd dddd dddd dddd dddd
就是这样的 一共24
pengzhixi 2010-10-27
  • 打赏
  • 举报
回复
class Basic{
public:
char a;
int b;
char c;
double d;
};
假设a成员的起始地址为0,那么b的地址应该是4(被4整除),c的起始地址为9,d的起始地址为16(被8整除)整体的大小就是24
  • 打赏
  • 举报
回复

class Basic{
public:
char c;//0
char a;//1
int b;//4-7
double d; //8-15
};
所以0-15占16个字节

  • 打赏
  • 举报
回复

class Basic{
public:
char a;//0
int b;//4-7
char c;//8
double d; //16-23
};
加上编译器填充,也就是24个字节


64,650

社区成员

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

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