请教:struct类型变量的数据对齐问题,有些难度!!!

jesun 2005-06-27 11:31:28
我们都知道,当前的编译器比如gcc默认情况下会对变量进行对齐。
比如int按4位对齐,short按2位对齐,char按一位对齐。。。。。。

可是,一个结构,怎么对齐呢?比如
struct{
char b;
int a;
}

这个结构大小应该是8,那么对齐的时候按照以下那种方式对齐呢?
1,根据第一个变量a来对齐,也就是1(char b)
2,根据结构中最大的变量来对齐,也就是4(int a)

欢迎高手踊跃发言!

...全文
267 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sea2000cn 2005-06-30
  • 打赏
  • 举报
回复
只要不产生数据缝隙就可以,对齐的目的就是不产生数据缝隙,提高效率
shadow22 2005-06-30
  • 打赏
  • 举报
回复
我试验了一下,在MIPS64系统中,s的地址是4字节对齐的,而int成员处在一个不对齐的地址上,在访问int成员时CPU会报异常.
Jiessie 2005-06-29
  • 打赏
  • 举报
回复
哈哈,既然你要提这个贴,且要在64bit下使用,我觉得你的结构定义就欠佳。你还用char b干嘛?真接写一个 int b不更快吗?
foochow 2005-06-27
  • 打赏
  • 举报
回复
操作系统为了提高系统总线的效率, 他会按类中最大的数据类型所占的大小来补齐其它变量,在这里最大的是int型,占4字节,因此系统会在char b后面补3个字节,总共就变成了8个字节.
foochow 2005-06-27
  • 打赏
  • 举报
回复
同意dongpy(51-->ARM)
tian_su 2005-06-27
  • 打赏
  • 举报
回复
up
sunman1982 2005-06-27
  • 打赏
  • 举报
回复
按照最严格的来对齐 ,题目种 就是4了
dongpy 2005-06-27
  • 打赏
  • 举报
回复
结构体变量按成员的最大对齐字节数对齐。

详细内容可查看FAQ。
sunman1982 2005-06-27
  • 打赏
  • 举报
回复
这个……看资料吧。资料看着爽
http://dev.csdn.net/article/49/article/48/48195.shtm
http://blog.dreambrook.com/soloist/archive/2004/12/12/388.aspx
http://www.softhouse.com.cn/html/200506/2005061509212900008335.html
jesun 2005-06-27
  • 打赏
  • 举报
回复
TO Jiessie(Jiessie)
如果你用过64位下的Unix/Linux,会发现所有结构都用#pragra pack()会出错,或者降低效率的。

TO sunman1982(冥王星)
请问gcc这方面有什么资料吗?

TO brianlu(-)
AAA已经8字节,就按照8字节对齐,有什么依据吗?

因为我遇到几个64位的系统上,发现好像是struct变量按照第一个元素变量的对齐来对齐,比如我那个例子,变量s首地址按照1字节对齐。
我想判断是不是编译器有问题,还是我的理解有问题,所以在这里问大家了。因此如果哪位能找到比较权威的资料,不胜感激。
brianlu 2005-06-27
  • 打赏
  • 举报
回复
struct AAA{
char b;
int a;
}
struct AAA s;

AAA已经是8字节了,按8字节对齐。
int a,a是4字节,struct内部变量a, b等等是按照4字节对齐,因为a是4字节.
brianlu 2005-06-27
  • 打赏
  • 举报
回复
struct AAA{
char b;
int a;
}
struct AAA s;

AAA已经是8位了,按8位对齐。
int a,a是4位,struct内部变量a, b等等是按照4位对齐,因为a是4位.
darkstar21cn 2005-06-27
  • 打赏
  • 举报
回复
0xbb0xaaaaaaaa0xXXXXXX
这么对齐的。
sunman1982 2005-06-27
  • 打赏
  • 举报
回复
似乎大家理解有些不一样。
我问的是这样

struct AAA{
char b;
int a;
}
struct AAA s;

那么,s的地址是1位还是4位对齐?
TO sunman1982(冥王星) -〉你说的4位是这个意思吗?
=====================
是的。当然,也是编译器相关的。
Jiessie 2005-06-27
  • 打赏
  • 举报
回复
在不同的环境下不一样吧。
建议任何时候,都要写上 #pragra pack(1) 或 #pragra pack(4)
ErikChen1985 2005-06-27
  • 打赏
  • 举报
回复
怎样叫对齐?
jesun 2005-06-27
  • 打赏
  • 举报
回复
似乎大家理解有些不一样。
我问的是这样

struct AAA{
char b;
int a;
}
struct AAA s;

那么,s的地址是1位还是4位对齐?
TO sunman1982(冥王星) -〉你说的4位是这个意思吗?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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