在默认情况下,数据一般都是以 4 字节对齐的(32 位机)。
同一个程序分别使用 VC 和 GCC 来编译都可以得到相同的结果:
[C++] 纯文本查看 复制代码 #include <stdio.h>
struct temp3 {
char a1;
int a2;
} C;
int main()
{
printf ("%d\n", sizeof(C));
return 0;
}
在两种编译器编译下,输出结果都是 8 。这是因为,访问内存的硬件电路,如果地址按照 4 字节对其那么访问效率就会高很多。所以,编译器会将 C 结构中的 char 型变量 a1 在扩充 3 个字节后,将整型变量 a2 对其到 4 字节倍数的地址上。
如果我们不希望编译器进行这种调整,那么针对于 VC 和 GCC 都有不同的伪指令使编译器采用上面的默认对齐。
在 VC 中使用 #pragma pack(n) 伪指令可以使数据按照 n 字节对齐。比如使用 #pragma pack(1) 伪指令使,数据将按照 1 字节对齐。比如如下声明结构体:
[C++] 纯文本查看 复制代码 #pragma pack(1)
struct temp3 {
char a1;
int a2;
}C;
#pragma pack()
那么在输出 sizeof(C) 时得到的值为 5 。上面最后一行 #pragma pack() 表示取消自定义的字节对齐方式。
在 GCC 中也有相似伪指令:__attribute__ ((packed)) 。比如我们将上面的结构体声明为:
[C++] 纯文本查看 复制代码 struct temp3 {
char a1;
int a2;
}__attribute__ ((packed)) C;
那么在输出 sizeof(C) 时结果也是为 5 。
上面取消默认对齐方式的做法,除非你觉得有必要,否则不要轻易做这种调整,因为这将降低程序的性能。目前比较常见的用法有两种:一是这个结构需要被直接写入文件;二是这个结构需要通过网络传送给其他程序。 |