分享
 
 
 

sizeof 和 alignment(对齐)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

sizeof 和 alignment(对齐)

1: alignment的定义

alignment指的是对象的开始地址必须满足条件:

>>#pragma pack(push, 1)

<<任何地址

>>#pragma pack(push, 2)

<<偶数地址

>>#pragma pack(push, 4)

<<地址必须是4的倍数

>>#pragma pack(push, 8)

<<地址必须是8的倍数

2: 基本类型T的alignment(T)

对齐值就是上面所说的1, 2, 4, 8

现在对应于每个类型T, 都有一个alignment(T)和T对应,

这个对应关系究竟如何呢:

(以下针对我们现在所碰到的编译器而言)

<< char --> 1 (永远是1)

<< short

#pragma pack(1) --> 1

#pragma pack(2) --> 2

#pragma pack(4) --> 2 // 呵呵,这里是关键

... --> 2

<< int

#pragma pack(1) --> 1

#pragma pack(2) --> 2

#pragma pack(4) --> 4 // 呵呵,这里是关键

... --> 4

...

这里就有了一个概念, 我们尚且将其命名为

internal_PACK(T):

internal_PACK(char) = 1

internal_PACK(short) = 2

internal_PACK(int) =4

internal_PACK(int64) = 8

...

和当前编译器的对齐方式无关。

编译其当前设置的#pragma pack(n)值我们命名为

PACK (= n)

那我们就有公式:

if (internal_PACK(T) < PACK)

alignment(T, PACK) = internal_PACK(T)

else

alignment(T, PACK) = PACK

下面的这个对任何类型T都成立:

alignment(T) <= PACK --------------------------------#1

3 struct(or class)类型ST的alignment(ST)

alignment(ST) = max { alignment(T) | T 是ST的data member 的类型 }

4 举例

<<

#pragma pack(1)

struct A

{

....

};

由#1, 在pack(1)的情况下所有的 alignment(type)≡1

<<

#pragma pack(4)

struct A

{

char ch;

short sh;

};

alignment(ch) = 1

alignment(sh) = 2

alignment(A) = 2

<<

#pragma pack(8)

struct A

{

char ch;

int n;

char ch;

};

alignment(n) = 4

alignment(A) = 4

<<

#pragma pack(2)

struct A

{

char ch;

int n;

char ch;

};

alignment(n) = 2

alignment(A) = 2

5: sizeof(T)

<<

对基本类型来说

sizeof(T) = internal_PACK(T)

<<

对结构类型ST来说

把最后一个数据成员m_last去掉后形成的结构叫ST~

sizeof(ST) = sizeof(ST~) + last_size + patch

其中

<<

last_size = member_patch + sizeof(m_last)

member_patch = [sizeof(ST~) 到 比它的alignment(m_last)倍数的最小距离] ;

<<

patch = [sizeof(ST~) + last_size到比它大的alignment(ST)倍数的最小距离]

其中

<<

member_patch是因为m_last要地址对齐alignment(m_last)

<<

patch 是因为如果声明一个数组的话:

ST st[2];

为了满足

1: st[1] 地址alignment(ST)对齐

2: sizeof(st) = sizeof(st1) + sizeof(st2)

关键是第二条

所以需要patch把余下的空间补满。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有