结构体的数据对齐?

mountaineer 2003-12-23 10:07:55
我们知道定义结构体时,为了优化
struct A{
char c1;
char c2;
int i1;
}
前两个char会占4个字节,这两个字节如何存放?它是如何优化的?为什么这样作可以优化?
一个编程规范中讲到:
在没有其他要求的情况下,优先使用int 类型.
优先使用有符号数。
能解释一下吗? 多谢了
...全文
106 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xilihuala 2004-01-06
  • 打赏
  • 举报
回复
gcc中你可以考虑用开关-fpack-struct来关闭自动填充.一般情况下,自动填充是无害的,也不影响读写效率,只是浪费空间而已,但是特殊情况下就必须要考虑填充的问题,如设定一个结构来映射某个寄存器空间,或者映射某个非对齐帧结构,那么,你就一定要取消自动填充了.
qian_gr 2004-01-06
  • 打赏
  • 举报
回复
如果是4字节对齐,一般会做如下填充
struct A{
char c1;
char c2;
char spare[2]
int i1;
}
所谓优化是从存取效率考虑,可以参考 zxm954712(三绝剑) 给出的链接。
int类型一般为4个字节,这个现在的32位机器有很微妙的关系,我们的数据总线是32位的,正好一次可以存取一个整型,所以一般来说,整型的存取效率是最高的。
sharkhuang 2003-12-24
  • 打赏
  • 举报
回复
你可以强行单字节对齐!pack(1)
zxm954712 2003-12-24
  • 打赏
  • 举报
回复
you may refer to http://expert.csdn.net/Expert/topic/2000/2000453.xml?temp=.2495996
19830711 2003-12-24
  • 打赏
  • 举报
回复
还没有考虑到这个问题
victor_cui 2003-12-24
  • 打赏
  • 举报
回复
其实你可以告诉编译器你需要什么样的对齐方式,当然是以牺牲一点电性能为代价的,比如你需要你的char只占用一个字节,则使用如下定义
#progma pack(1)
you struct define....
#progma pack()
上面的1是告诉编译器你的对齐方式是以单字节为单位,如果你需要你的char 占4个字节把
pack(1) => pack(4)就可以了
pig1210127 2003-12-24
  • 打赏
  • 举报
回复
没注意这个问题
gz 一下
SCUM 2003-12-23
  • 打赏
  • 举报
回复
就个人看法简单地说:

CPU 进行内存R/W的时候
一次访问WORD或DWORD要比访问BYTE快
这步优化其实由硬件完成
而提供优先使用signed int(32bit 64bit)也是由于CPU内建了对此数据类型的优化MicroCode
不过就普通桌面应用而言
过于纠缠此细节并无实际意义
当然
理论研究不在讨论之列

69,371

社区成员

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

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