请问4字节对齐和1字节对齐是什么意思?具体在哪里应用不同?新手请各位大虾赐教

ccc2006 2006-03-28 12:09:38
用上
...全文
2161 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iolia 2006-03-30
  • 打赏
  • 举报
回复 1
可以这样看,n字节对齐就是每个成员的存放地址偏移量应该是0,n,2n...等n的整数倍,如果不是的话,就要空出相应的字节出来,比如此例4字节对齐
char tName[20] 占用0-19这20个字节, char tAttribute[20]从20开始,是4的整数倍,占用20-39这20字节,同理char tAttribute[10]占用40-49这10个字节,但接下来的字节偏移量是50,不是4的整数倍,故就得空出2个字节,让tuple *next从偏移量为52的地方开始存放
postren 2006-03-30
  • 打赏
  • 举报
回复
VC中可以用 #pragma pack(8)来指定对齐方式为8
fish_kun 2006-03-30
  • 打赏
  • 举报
回复
我最先看到这个的是朗讯的一道笔试题,原理实际上是机器数为32,在编译器优化时,需要做对齐处理。
typedef struct
{
char a;
int b;
char c;
char d;
int e;
char f;
} data; data 在编译后为:a 占4位,b占4位,c占4位,d占4位,e占4位,f占4位。
typedef struct
{
char a;
char c;
char d;
char f;
int b;
int e;
} data; 在编译后acdf占4位,b,e各占4位。
当然,也可以用不对齐的命令,让编译器不要做这些。
总的说来,编译器优化需要将各种类型对齐成机器字(x86结构为4字节)。
这个问题一般是对系统要求比较高,比如说和硬件相关的编码(好的结构可以节约存储空间),一般的情况下,除了面试,笔试,也不怎么管。至于这是lucent的笔试题,估计就是这些人需要做通信相关硬件的编码搞的,呵呵。
bryanthsu 2006-03-30
  • 打赏
  • 举报
回复
学习
ccc2006 2006-03-28
  • 打赏
  • 举报
回复
能否举个实例说说

class tuple
{
public:
char tName[20];
char tAttribute[20];
char tAttrtype[10];
tuple *next;
}
这个对象是不是在内存中占的字节数应该是根据字节对齐方式有所不同,在1/4/8字节对齐方式下,这个对象分别占多少字节呢
积木 2006-03-28
  • 打赏
  • 举报
回复
cpu在一个周期内只能处理一个单位的数据,这个单位是根据cpu能处理字的长度不同而不同。
所以如果打算让cpu物尽其用。那就尽量使用合适的字节对其。
ykzhujiang 2006-03-28
  • 打赏
  • 举报
回复
在struct等结构的对齐上面应用
4字节对齐的意思是4字节为一个对齐单位
1字节对齐的意思就是连续存放
duanliyu 2006-03-28
  • 打赏
  • 举报
回复
学习
yinqing_yx 2006-03-28
  • 打赏
  • 举报
回复
引用论坛上某网友的帖子解释:共同学习~~~~~~~~~~
复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。
顺便提一下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。对界是可以更改的,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。C++固有类型的对界取编译器对界方式与自身大小中较小的一个。例如,指定编译器按2对界,int类型的大小是4,则int的对界为2和4中较小的2。在默认的对界方式下,因为几乎所有的数据类型都不大于默认的对界方式8(除了long double),所以所有的固有类型的对界方式可以认为就是类型自身的大小。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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