4 回答
TA贡献1856条经验 获得超17个赞
这是因为添加了填充以满足对齐约束。数据结构对齐会影响程序的性能和正确性:
错误对齐访问可能是一个很难的错误(通常
SIGBUS
)。错误对齐的访问可能是软错误。
在硬件中进行了更正,以适度降低性能。
或者通过软件仿真进行校正,以降低性能。
此外,原子性和其他并发保证可能会被破坏,从而导致细微的错误。
以下是使用x86处理器的典型设置(所有使用的32位和64位模式)的示例:
struct X{ short s; /* 2 bytes */ /* 2 padding bytes */ int i; /* 4 bytes */ char c; /* 1 byte */ /* 3 padding bytes */};struct Y{ int i; /* 4 bytes */ char c; /* 1 byte */ /* 1 padding byte */ short s; /* 2 bytes */};struct Z{ int i; /* 4 bytes */ short s; /* 2 bytes */ char c; /* 1 byte */ /* 1 padding byte */};const int sizeX = sizeof(struct X); /* = 12 */const int sizeY = sizeof(struct Y); /* = 8 */const int sizeZ = sizeof(struct Z); /* = 8 */
可以通过对齐对成员进行排序来最小化结构的大小(按照基本类型中的大小排序)(Z
如上例中的结构)。
重要说明:C和C ++标准都声明结构对齐是实现定义的。因此,每个编译器可能选择以不同方式对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。某些编译器具有命令行设置和/或特殊#pragma
语句来更改结构对齐设置。
TA贡献1844条经验 获得超8个赞
这可能是由于字节对齐和填充,因此结构在平台上产生偶数个字节(或字)。例如,在Linux上的C中,有以下3种结构:
#include "stdio.h"
struct oneInt {
int x;
};
struct twoInts {
int x;
int y;
};
struct someBits {
int x:2;
int y:6;
};
int main (int argc, char** argv) {
printf("oneInt=%zu\n",sizeof(struct oneInt));
printf("twoInts=%zu\n",sizeof(struct twoInts));
printf("someBits=%zu\n",sizeof(struct someBits));
return 0;
}
具有大小(以字节为单位)的成员分别是4字节(32位),8字节(2x32位)和1字节(2 + 6位)。上面的程序(在Linux上使用gcc)将大小打印为4,8和4 - 其中最后一个结构被填充,因此它是一个单词(在我的32位平台上为4 x 8位字节)。
oneInt=4
twoInts=8
someBits=4
- 4 回答
- 0 关注
- 932 浏览
添加回答
举报