先说pragma,参考msdn,
A "pragma" instructs the compiler to perform a particular action at compile time. Pragmas vary from compiler to compiler.
再来说pragma pack这个制定字节对其的指令,如果制定了字节对齐,那么编译器将按照指定好的指令来生成代码,对性能将会造成一定影响。编译器的默认优化,有点空间换取时间的感觉。。
#pragma pack
instructs the compiler to pack structure
members with particular alignment. Most compilers, when you declare a struct,
will insert padding between members to ensure that they are aligned to
appropriate addresses in memory (usually a multiple of the type‘s size). This
avoids the performance penalty (or outright error) on some architectures
associated with accessing variables that are not aligned properly. For example,
given 4-byte integers and the following struct:
structTest{ char one; int two; char three; };
The compiler could choose to lay the struct out in memory like this:
Bytes: | 1 | 2 3 4 | 5 6 7 8 | 9 | 10 11 12 | Member: | one | padding | two | three | padding |
and sizeof(Test)
would be 12, even though it only
contains 6 bytes of data. The most common use case for
the #pragma
(to my knowledge) is when working with
hardware devices where you need to ensure that the compiler does not insert
padding into the data and each member follows the previous one.
With #pragma pack(1)
, the struct above would be laid out like
this:
Bytes: | 1 | 2 3 4 5 | 6 | Member: | one | two | three |
Andsizeof(Test)
would be 6.
也就是说,如果指定了pragma pack(n),那么每个数据成员的对齐方式为其默认对齐字节数与n的最小值,而整个结构体的对齐方式取其最大数据成员的字节数和n的最小值