C++如何设置字节对齐
(2018-01-24 10:50:50)
标签:
c字节对齐 |
分类: c |
目前普遍使用的是两种方式:
第一种:
#pragma pack(n) // 编译器将按照n个字节对齐。
#pragma pack() //
取消自定义字节对齐方式(取消后恢复到编译器默认的对齐方式)。
第二种:
#pragma pack (push,n) //
把原来对齐方式设置压栈,并设新的对齐方式为n个字节对齐
#pragma pack(pop)
//
恢复原来对齐方式
从上面两点来看#pragma pack(n)与#pragma pack
(push,n)来看,他们之间的区别并不大,可以相互代替,只是后者恢复时是恢复到了原来的对齐方式,而前者是恢复到了编译器默认的对齐方式。推荐使用后者。
-
#include
-
//
采用默认的字节对齐方式, 即t1中最长的类型int, 即4字节对齐 -
struct
t1 -
{
-
char c; -
int i; -
short s; -
float f; -
char c1; -
};
-
-
#pragma
pack(2) // 编译器将按照2个字节对齐 -
-
// 2字节对齐 -
struct t2 -
{ -
char c; -
int i; -
short s; -
float f; -
char c1; -
}; -
-
#pragma pack(push, 1) // 把原来对齐方式(2字节)置压栈,并设新对齐方式为1字节 -
-
// 1字节对齐 -
struct t3 -
{ -
char c; -
int i; -
short s; -
float f; -
char c1; -
}; -
-
#pragma pack(2) // 编译器将按照2个字节对齐 -
-
// 2字节对齐 -
struct t4 -
{ -
char c; -
int i; -
short s; -
float f; -
char c1; -
}; -
-
#pragma pack() // 取消自定义字节对齐(2字节)方式, 采用默认字节对齐方式 -
-
// 采用默认的字节对齐方式, 即t5中最长的类型int, 即4字节对齐 -
struct t5 -
{ -
char c; -
int i; -
short s; -
float f; -
char c1; -
}; -
-
-
#pragma pack(pop) // 取消1字节对齐方式。恢复到原来的2个字节对齐方式 -
-
// 2字节对齐 -
struct t6 -
{ -
char c; -
int i; -
short s; -
float f; -
char c1; -
}; -
-
#pragma
pack() // 取消自定义字节对齐(2个字节)方式, 采用默认的字节对齐方式 -
-
//
采用默认的字节对齐方式, 即t7中最长的类型int, 即4字节对齐 -
struct
t7 -
{
-
char c; -
int i; -
short s; -
float f; -
char c1; -
};
-
-
int
main() -
{
-
printf("sizeof(char): %d\n" ,sizeof(char)); -
printf("sizeof(short): %d\n" ,sizeof(short)); -
printf("sizeof(int): %d\n" ,sizeof(int)); -
printf("sizeof(float): %d\n" ,sizeof(float)); -
-
printf("\n=======================================\n\n"); -
-
printf("sizeof(t1): %d\n" ,sizeof(t1)); -
printf("sizeof(t2): %d\n" ,sizeof(t2)); -
printf("sizeof(t3): %d\n" ,sizeof(t3)); -
printf("sizeof(t4): %d\n" ,sizeof(t4)); -
printf("sizeof(t5): %d\n" ,sizeof(t5)); -
-
printf("sizeof(t6): %d\n" ,sizeof(t6)); -
printf("sizeof(t7): %d\n" ,sizeof(t7)); -
-
return 0; -
}
-
-