有关内存对齐的疑问

zhhonghui 2007-07-11 02:19:47
#include<stdlib.h>
#include<stdio.h>

typedef struct str1
{
char a;
char b;
double c;
}STR1;
int main()
{
//float a;
printf("The size is: %d\n",sizeof(STR1));
return 0;
}

在网上看到“任何2字节大小的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。”
那么char的对齐模式应该是2或1,double为4
假设char为1,内存布局应该是
--------------
|a |b |////////| c | sizeof(STR1) == (1+1+2+4 = 8)
--------------
1bit 1bit 2bit 4bit
即使char为2,内存布局也应该是这样:
--------------
|a |//|b|//| c | sizeof(STR1) == (1+1+1+1+4 = 8)
--------------
1bit 1bit 4bit

但是结果却是12
...全文
190 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
其实我一开始就错了,double的模数的确是4
而size应为
2+2+8=12
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
a,b,c 的偏移量分别是
0,1,4

问题解决,结帖
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
呵呵,谢谢了,刚才我用man offsetof就有好多信息了
谢谢!
taodm 2007-07-11
  • 打赏
  • 举报
回复
我有msn不如你有msdn。
对齐啊,offsetof啊,标准C编程方面最佳文档就是msdn了。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
不知道怎么使用那些东西,你有没有msn?我觉得那样请教更方便点
taodm 2007-07-11
  • 打赏
  • 举报
回复
使用标准C宏offsetof,可以让你看出每个字段现在的偏移量。
自己试试就知道了。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
这是我gcc的版本信息:

gcc -v
使用内建 specs。
目标:i486-linux-gnu
配置为:../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
线程模型:posix
gcc 版本 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
taodm 2007-07-11
  • 打赏
  • 举报
回复
对齐的决定权是编译器,不是操作系统!
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
我查了几个资料,说是linux下超过2个字节的都是以4为对齐模数呀
taodm 2007-07-11
  • 打赏
  • 举报
回复
你那个资料错的。
double的对齐大小是sizeof(double),一般是8字节。
重新google 对齐,再找几篇看看。
zhhonghui 2007-07-11
  • 打赏
  • 举报
回复
画的图显示得有点问题,第一个图的斜线为填充的两个bit
第二个图为填充的一个bit

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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