#pragma pack(2) 的含义是什么?

3

pragma pack(2)

是什么意思?

它是做什么用的?

4个回答

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。重要提示:仅在您知道自己在做什么并且确实需要时才使用,注意其中可能存在的问题。

第一个结构体将使用3个字节,而不是4个 - pack()不意味着填充结构体的末尾。 - Erik
@daniel...我正在复制粘贴一段代码片段...请在这段代码的上下文中解释一下。提前致谢。 - phoenix
#include <stdio.h> /* int 的大小为 4 字节 */

pragma pack(2)

struct SIZE { int i; char ch ; double db ; } main () { printf ( "%d\n",sizeof(struct SIZE) ); }
- phoenix
@phoenix:应该是4(整型)+1(字符型)+1(填充)+8(假设双精度为8字节)=14。 - Daniel Hilgarth
如果我想让这个指令只影响代码的特定部分,而不影响其余部分...有办法吗? - phoenix
@phoenix:当我告诉你阅读文档时,我是认真的;-) #pragma pack(pop) 就是你要找的。 - Daniel Hilgarth

2

这是一个特定于Visual Studio的pragma指令,它可以改变struct中成员的对齐方式。完整的细节可以在MSDN上找到,但其要点是它允许您自定义在struct元素之间放置多少填充。紧密地打包可以使用更少的空间,但可能会导致对齐问题。


1
也适用于gcc - jonsca

0

这意味着编译器应该对结构体/类/联合体成员进行打包,以便它们在2字节边界上对齐。

struct Foo {
  char c1;
  int i1;
};

使用pack(2),结构体将会有以下内容:

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

请注意,所有的编译指示都是特定于编译器的 - 这个可以在VC和gcc上工作。


非常感谢您的帮助,Erik...但是您能帮我解决这段代码并在此代码的上下文中解释相同的概念吗?#include <stdio.h> /* int 的大小为 4 字节 */

pragma pack(2)

struct SIZE { int i; char ch ; double db ; } main () { printf ( "%d\n",sizeof(struct SIZE) ); }
- phoenix
结构体将会是:4字节整型,1字节字符型,1字节填充,sizeof(double)字节双精度浮点型 - 所有成员字段都对齐,以便它们从结构体开始的偏移量可被2整除。 - Erik

0

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

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

如果您在文件级别使用它,最好在更改之前保存打包对齐方式,并在应用新的打包对齐方式的声明结束时将其恢复到先前的值。

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

对于MS VS 6.0:请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接