20180315 代码错题(2)

下面两个结构体
1
2
3
4
5
6
7
8
9
10
struct One{
    double d;
    char c;
    int i;
}
struct Two{
    char c;
    double d;
    int i;
}
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是
16 24,16 24
16 20,16 20
16 16,16 24
16 16,24 24

答案C 错选D

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

 

每个特定平台上的编译器都有自己的默认“对齐系数”(32位机一般为4,64位机一般为8)。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。

 

struct 或者 union 成员对齐规则如下:

 

1. 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐;

2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行;

 

先局部成员对齐,然后再全局对齐。



posted @ 2018-03-15 16:29  Kxzh  阅读(113)  评论(0编辑  收藏  举报