Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151068
  • 博文数量: 29
  • 博客积分: 795
  • 博客等级: 军士长
  • 技术积分: 312
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-18 11:13
文章分类
文章存档

2016年(2)

2012年(1)

2011年(5)

2009年(4)

2008年(8)

2007年(4)

2006年(3)

2005年(2)

我的朋友

分类: C/C++

2011-01-10 09:39:03

pack Pragma

#pragma pack [ ([[max_member_alignment], [min_structure_alignment][, byte-swap]]) ]

The pack directive specifies that all subsequent structures are to use the alignments given by max_member_alignment and min_structure_alignment where:
max_member_alignment
Specifies the maximum alignment of any member in a structure. If the natural alignment of a member is less than or equal to max_member_alignment, the natural alignment is used. If the natural alignment of a member is greater than max_member_alignment, max_member_alignment will be used.
Thus, if max_member_alignment is 8, a 4-byte integer will be aligned on a 4-byte boundary.
While if max_member_alignment is 2, a 4-byte integer will be aligned on a 2-byte boundary.
min_structure_alignment
Specifies the minimum alignment of the entire structure itself, even if all members have an alignment that is less than min_structure_alignment.
byte-swap
If 0 or absent, bytes are taken as is. If 1, bytes are swapped when the data is transferred between byte-swapped members and registers or non-byte-swapped memory. This enables access to little-endian data on a big-endian machine and vice-versa.
It is not possible to take the address of a byte-swapped member.
If neither max_member_alignment nor min_structure_alignment are given, they are both set to 1. If either max_member_alignment or min_structure_alignment is zero, the corresponding default alignment is used. If max_member_alignment is non-zero and min_structure_alignment is not given it will default to 1.
The form #pragma pack is equivalent to #pragma pack(1,1,0). The form #pragma pack( ) is equivalent to #pragma pack(0,0,0).
The align pragma, provided for portability, is an exact synonym for pack.
An alternative method of specifying structure padding is by using .
Default values for max_member_alignment and min_structure_alignment can be set by using the -Xmember-max-align and the -Xstruct-min-align options. The order of precedence is values -X options lowest, then the packed pragma, and __packed__ or packed keyword highest.
Restrictions and Additional Information
Note that if a structure is not packed, the compiler will insert extra padding to assure that no alignment exception occurs when accessing multi-byte members, if required by the selected processor. See  .
When a structure is packed, if the processor requires that multi-byte values be aligned (-Xalign-min > 1), the following restrictions apply:
Access to multi-byte members will require multiple instructions. (This is so even if a member is aligned as would be required within the structure because the structure may itself be placed in memory at a location such that the member would be unaligned, and this cannot be determined at compile time.)
volatile members cannot be accessed atomically. The compiler will warn and generate multiple instructions to access the volatile member. Also, "compound" assignment operators to volatile members, such as +=, |=, etc., are not supported. For example, assuming i is a volatile member of packed structure struct1, then the statement:

        struct1.i += 3;

must be recoded as:

        struct1.i = struct1.i + 3;

In addition, for packed structures, an enum member will use the smallest type sufficient to represent the range, see .
Examples
Later examples depend on earlier examples in some cases.

    #pragma pack (2,2)

 

    struct s0 {

 

        char a;

1 byte at offset 0, 1 byte padding 

        short b;

2 bytes at offset 2 

        char c;

1 byte at offset 4 

        char d;

1 byte at offset 5 

        int e;

4 bytes at offset 6 

        char f;

1 byte at offset 10 

    };

total size 11, alignment 2 

If two such structures are in a section beginning at offset 0xF000, the layout would be:

    #pragma pack (1)

Same as #pragma pack(1,1), no padding.

    struct S1 {

 

        char c1

1 byte at offset 0

        long i1;

4 bytes at offset 1

        char d1;

1 byte at offset 5

    };

total size 6, alignment 1

     

 

    #pragma pack (8)

Use "natural" packing for largest member.

    struct S2 {

 

        char c2

1 byte at offset 0, 3 bytes padding

        long i2;

4 bytes at offset 4

        char d2;

1 byte at offset 8, 3 bytes padding

    };

total size 12, alignment 4

     

 

    #pragma pack (2,2)

Typical packing on machines which cannot

    struct S3 {

access multi-byte values on odd-bytes.

        char  c3;

1 byte at offset 0, 1 byte padding

        long i3;

4 bytes at offset 2

        char d3;

1 byte at offset 6, byte padding

    };

total size 8, alignment 2

     

 

    struct S4 {

Using pragma from prior example.

        char c4;

1 byte at offset 0, 1 byte padding

    };

total size 2, alignment 2 since

     

min_member_alignment is 2 above

     

 

    #pragma pack (8)

"Natural" packing since S3 is 8 bytes long.

    struct S {

 

        char e1;

1 byte at offset 0

        struct S1 s1;

6 bytes at offset 1, 1 byte padding

        struct S2 s2;

12 bytes at offset 8

        char e2;

1 byte at offset 20, 1 byte padding

        struct S3 s3;

8 bytes, at offset 22, 2 bytes padding alignment 2

    };

total size 32, alignment 4

     

 

    #pragma pack (0)

Set to default packing.

阅读(4328) | 评论(0) | 转发(0) |
0

上一篇:ls -al ipt_*.c

下一篇:EMC电磁兼容

给主人留下些什么吧!~~