BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #41162同步于 2010/7/10
CPP机器人发帖

[合集] 【求助】关于内存对齐的问题

shenlei
2010/7/10镜像同步0 回复
☆─────────────────────────────────────☆ chrischen25 (蜡人) 于 (Mon Nov 9 19:23:18 2009) 提到: struct _THUNDER{ char cAdv; double ca; char cTag; char cc; char cd; short cb; int iVersion; int iUser; char cEnd; }Thunder; 电脑算出来的结果是40。 我在网上查询的相关网页,说法都不太一样,麻烦大牛指教一下,谢谢各位啦! ☆─────────────────────────────────────☆ kmplayer (就是喜欢她) 于 (Mon Nov 9 19:33:50 2009) 提到: char :占8个字节 double:8个字节 char、char、char、short:8个字节 int、int:8个字节 char:8个字节。 应该是这样的吧。 ☆─────────────────────────────────────☆ guo (计忆邮心|郭) 于 (Mon Nov 9 19:46:34 2009) 提到: char 1 补7字节 double 8 char 1 char 1 char 1 补1字节 short 2 补2字节 int 4 int 4 char 1 补7字节 共40字节 ☆─────────────────────────────────────☆ guo (计忆邮心|郭) 于 (Mon Nov 9 19:49:21 2009) 提到: 第一次补7是因为double需要8字节对齐 第一次补1是因为short需要2字节对齐 第一次补2是因为int需要4字节对齐 第二次补7是因为struct需要是最大成员(double)的整数倍 ☆─────────────────────────────────────☆ cdy (BECKS) 于 (Mon Nov 9 20:08:13 2009) 提到: 结构体的大小需要时最大成员字节数的整数倍 ☆─────────────────────────────────────☆ jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Mon Nov 9 20:08:50 2009) 提到: 【 在 guo 的大作中提到: 】 : 第一次补7是因为double需要8字节对齐 : 第一次补1是因为short需要2字节对齐 : 第一次补2是因为int需要4字节对齐 : ................... 恩,说得很明白~~ ☆─────────────────────────────────────☆ ericyosho (ericyosho) 于 (Mon Nov 9 21:57:49 2009) 提到: 我咋gcc和g++都是32呢? gcc version 4.4.1 考虑, char 4 double 8 char char char 4 short 4 int 4 int 4 char 4 所以一共32,没想明白,怎么还要8字节对齐。难道是64位机器? ☆─────────────────────────────────────☆ jmpesp (垃圾|人渣|缅甸果敢第一司令) 于 (Mon Nov 9 22:22:04 2009) 提到: 【 在 ericyosho 的大作中提到: 】 : 我咋gcc和g++都是32呢? : gcc version 4.4.1 : 考虑, : ................... 其实这个跟编译器有很大的关系的。 ☆─────────────────────────────────────☆ chrischen25 (蜡人) 于 (Tue Nov 10 00:11:31 2009) 提到: 【 在 guo 的大作中提到: 】 : 第一次补7是因为double需要8字节对齐 : 第一次补1是因为short需要2字节对齐 : 第一次补2是因为int需要4字节对齐 : ................... 哦,好的,谢谢啦 ☆─────────────────────────────────────☆ chrischen25 (蜡人) 于 (Tue Nov 10 00:11:44 2009) 提到: 谢谢各位热心人 ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Tue Nov 10 08:02:33 2009) 提到: 我咋觉得这个取决于实现呢... 【 在 chrischen25 (蜡人) 的大作中提到: 】 : struct _THUNDER{ : char cAdv; : double ca; : ................... ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Tue Nov 10 08:28:04 2009) 提到: vc6比较笨 【 在 ericyosho (ericyosho) 的大作中提到: 】 : 我咋gcc和g++都是32呢? : gcc version 4.4.1 : 考虑, : ................... ☆─────────────────────────────────────☆ LoveRose (江南西道|Movie|路过团镇团正太) 于 (Tue Nov 10 10:23:56 2009) 提到: 跟编译器有关吧 【 在 shenlei (我爱果子|[路]|天山南北|潇湘隐士) 的大作中提到: 】 : 我咋觉得这个取决于实现呢... ☆─────────────────────────────────────☆ guo (计忆邮心|郭) 于 (Tue Nov 10 10:32:35 2009) 提到: 呃 确实 我也是gcc 4.4.1 不过是在x86_64的机器上试的 【 在 ericyosho 的大作中提到: 】 : 我咋gcc和g++都是32呢? : gcc version 4.4.1 : 考虑, : ................... ☆─────────────────────────────────────☆ xieys (枫叶/兄弟会堂主/借楼同征外援) 于 (Tue Nov 10 11:54:55 2009) 提到: 加上#pragma pack(num)就会有不同的结果 ☆─────────────────────────────────────☆ goter (真三八无双) 于 (Tue Nov 10 16:40:45 2009) 提到: 最后一个char为什么要是4呢?1不就得了? ☆─────────────────────────────────────☆ epavel (Aerith) 于 (Tue Nov 10 17:38:47 2009) 提到: 【 在 goter 的大作中提到: 】 : 最后一个char为什么要是4呢?1不就得了? 为了之后如果还有结构或者类定义时寻址方便吧 ☆─────────────────────────────────────☆ cyun (摸球二当家||【摸球教】之一“二”解千愁) 于 (Tue Nov 10 17:57:52 2009) 提到: 【 在 ericyosho 的大作中提到: 】 : 我咋gcc和g++都是32呢? : gcc version 4.4.1 : 考虑, : ................... 楼主可能在windows下,对齐比较严格,double的地址都应该是8的倍数 而如果使用linux+gcc的话double会是4对齐,只有gcc -malign-double 会是8对齐 ☆─────────────────────────────────────☆ ssailing (sailing) 于 (Tue Nov 10 18:57:33 2009) 提到: 【 在 cyun 的大作中提到: 】 : 楼主可能在windows下,对齐比较严格,double的地址都应该是8的倍数 : 而如果使用linux+gcc的话double会是4对齐,只有gcc -malign-double 会是8对齐 正解 linux下gcc默认是4字节对齐,linux需要在makefile中更改 而在Windows下VC的默认对齐是8字节,可以通过菜单修改 ☆─────────────────────────────────────☆ laser (回头瞧一瞧) 于 (Tue Nov 10 20:00:58 2009) 提到: 这个跟设置的编译器的对齐因子有关系!如果按8字节对齐就是40,按照4对齐就是32 ☆─────────────────────────────────────☆ goter (真三八无双) 于 (Wed Nov 11 08:24:40 2009) 提到: 【 在 epavel 的大作中提到: 】 : 为了之后如果还有结构或者类定义时寻址方便吧 struct ss{ char a; char b; char c; } 这个的大小是3,不是4
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。