与#pragma指令有关

时间:2011-03-25 08:46:30

标签: c pragma

当我#pragma pack(2)时,它究竟意味着什么?

4 个答案:

答案 0 :(得分:3)

这意味着结构,联合或类由2个字节对​​齐。这意味着,以下结构将在内存中使用3个字节而不是2:

struct MyStruct
{
    char Field1;
    char Field2;
};

以下将使用4个字节:

struct MyStruct
{
    WORD Field1;
    WORD Field2;
};

更多信息:http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx。重要提示:阅读有关问题的信息,只有当您知道自己在做什么并且需要时才使用它; - )

答案 1 :(得分:1)

这是一个特定于Visual Studio的pragma指令,用于更改struct中成员的对齐方式。完整的详细信息可以找到here on the MSDN,但它的要点是它允许您自定义在struct的元素之间放置多少填充。更紧凑的包装使用更少的空间,但可以解决对齐问题。

答案 2 :(得分:0)

这意味着编译器应该打包struct / class / union成员,以便它们在2字节边界上对齐。

struct Foo {
  char c1;
  int i1;
};

使用pack(2),结构将具有:

  • char
  • 的1个字节
  • 1个未使用的字节,填充
  • int
  • 的4个字节(假设为32位)

请注意,所有编译指示都是特定于编译器的 - 但是这个编译指示同时适用于VC和gcc。

答案 3 :(得分:0)

这意味着在结构的第一个成员之后的pragma之后声明的结构,类或联合的每个成员都存储在成员类型或2字节边界的大小的倍数中,以较小者为准。

#pragma pack(n)将影响其后面的结构,类和联合的大小。

如果您在文件级别使用它,那么在更改它之前保存打包对齐并在要应用新打包对齐结束的声明时将其恢复为之前的值可能是一个很好的想法。

当然,您应该查看编译器的文档。

对于MS VS 6.0:请参阅Here