今天遇到了一个内存对齐的题,有些迷糊,求解答。

-迷糊- 2011-03-17 10:17:40
在windows 32位机上,大概意思是这样的:

struct data1

long a;
int b[5];
char c;
}A;
struct data2
{
long d;
data1 e;
char f;
}B;

问sizeof B是多少?
...全文
215 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_admi 2011-03-18
  • 打赏
  • 举报
回复
我觉得四楼的好奇怪啊。我先报一下我这里的基本运算结果。

VC 6.0 + WINDOWS XP + INTEL X86 32BIT CPU + VC默认设置:

sizeof(long) = 4
sizeof(int ) = 4
sizeof(char) = 1

因此,sizeof(A) = 4+4*5+4 =28,sizeof(B) = 4 + 28 + 4 = 36,正如3楼所说。这里最长的,也就4个字节。
hmilyopq 2011-03-18
  • 打赏
  • 举报
回复
36,28+8
yanran_hill 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dy110936 的回复:]
引用 6 楼 super_admi 的回复:

我觉得四楼的好奇怪啊。我先报一下我这里的基本运算结果。

还有我想问下是所有win32的编译器int都是4字节吗?
[/Quote]
老生常谈了

#pragma pack(4) //4字节对齐
struct data2
{
...
};
#pragma pack(8) //8字节对齐
...
#pragma pack //默认对齐方式,依赖于gcc编译器的参数配置
apollofsc2008 2011-03-18
  • 打赏
  • 举报
回复
36,前面人解释过了
友林 2011-03-18
  • 打赏
  • 举报
回复
关于内存对齐,昨天刚整理了一下,在我的博客里面。
http://blog.csdn.net/formality/archive/2011/03/17/6257557.aspx
在windows 32位机上,默认是#pragma pack(8)
waxilo1988 2011-03-18
  • 打赏
  • 举报
回复
重温了一下内存对齐,,,,
我感觉把 这玩意要 人性化 思考 内存
就很好理解。
比如 都是 最大的是 4个 4个放的。 就必须是4的倍数
所以第一个里面 就放了long 4个 int【5】 5个4个 char 虽然1个 但是对齐 就占了多余3个,总共4个。占着茅坑没拉屎。。。总共占28个
B里面呢。。 就不能说是data1 那么大的放, 因为data1 不是基本类型嘛。最大的放内存里 其实也是4个4个放的,。。。所以long 4个 data1 28个 最后 char 虽然也是1 但是对齐于4个。。(同上)结果 36个!!!!!!

别想把 两个 char 挤一起 哦
maoxing63570 2011-03-18
  • 打赏
  • 举报
回复

struct data1
{
long a;//[0...3]
int b[5];//[4.....23]
char c;//[24...27]
}A;
struct data2
{
long d;//[0...3]
data1 e;//[4.......31]
char f;//[32....35]
}B;
天山游龙 2011-03-18
  • 打赏
  • 举报
回复
size(A) = 4 + 4 * 5 + 4 = 28;
size(B) = 4 + 28 + 4 = 36;
luxihua 2011-03-18
  • 打赏
  • 举报
回复
这个执行写个代码执行下不就清楚了。
碎碎念 2011-03-18
  • 打赏
  • 举报
回复
4楼我也觉得奇怪....

long类型是4字节吧....


sizeof B 如果编译器不是默认4字节对齐的话,应该是33
-迷糊- 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 super_admi 的回复:]

我觉得四楼的好奇怪啊。我先报一下我这里的基本运算结果。

VC 6.0 + WINDOWS XP + INTEL X86 32BIT CPU + VC默认设置:

sizeof(long) = 4
sizeof(int ) = 4
sizeof(char) = 1

因此,sizeof(A) = 4+4*5+4 =28,sizeof(B) = 4 + 28 + 4 = 36,正如……
[/Quote]
恩,您和3楼是对的。4楼有些。。。
我想问下结构体data2中的data1是分开看的,不是看做一个28整体的整体?
还有我想问下是所有win32的编译器int都是4字节吗?
我很菜见笑了啊。
-迷糊- 2011-03-18
  • 打赏
  • 举报
回复
我大概理解了。
有两条规则,一是要按照当前的类型来对齐首地址;二是最后要按照最大的类型来对齐整体。
结构体中嵌套的结构体按照嵌套的结构体中最大的对齐。
谢谢大家,接贴了。
-迷糊- 2011-03-17
  • 打赏
  • 举报
回复
是所有编译器的int都是4字节吗?
lovesi3344 2011-03-17
  • 打赏
  • 举报
回复
struct data1

long a; 8
int b[5]; 4 8+4 = 12
char c; 1 12 + 1 = 13 13 + 3 = 16 即sizeof(A) = 16
}A;
struct data2
{
long d; 8
data1 e; 16 8+ 16 = 24
char f; 1 16 + 1 = 17 17+15 = 32 即sizeof(B) = 32
}B;
失散糖 2011-03-17
  • 打赏
  • 举报
回复
36

为了对齐,A的c成员占了4个字节,然后还是为了对齐,B的f占了4个字节
pengzhixi 2011-03-17
  • 打赏
  • 举报
回复
没编译器吗?随便下个DEV,code:block都可以
witwolf 2011-03-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/hkx1n/archive/2009/06/16/4274309.aspx
内存对齐可以参考下这篇文章

64,646

社区成员

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

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