代码改变世界

C++中的#pragma pack效果

2014-01-15 23:25  Ryan_Liu  阅读(855)  评论(0编辑  收藏  举报

先说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  |
And sizeof(Test) would be 6.

也就是说,如果指定了pragma pack(n),那么每个数据成员的对齐方式为其默认对齐字节数与n的最小值,而整个结构体的对齐方式取其最大数据成员的字节数和n的最小值