【问题标题】:Meaning of #pragma pack(2)#pragma pack(2) 的含义
【发布时间】:2011-03-25 08:46:30
【问题描述】:

做什么

编译指示包(2)

做吗?什么意思?

【问题讨论】:

    标签: c pragma


    【解决方案1】:

    这意味着结构、联合或类按 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() 并不意味着填充结构的末尾。
    • @daniel ...m 复制粘贴代码 sn-p...请在此代码的上下文中解释相同的内容。提前致谢
    • #include /* int 的大小为 4 个字节 */ # pragma pack(2) struct SIZE { int i;字符 ch ;双分贝; } main () { printf ("%d\n",sizeof(struct SIZE)); }
    • @phoenix: 应该是 4(int)+1(char)+1(padding)+8(假设 double 是 8 字节) = 14
    • 如果我希望该指令仅影响代码的特定部分,而其余部分不受其影响...有出路吗???
    【解决方案2】:

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

    【讨论】:

    • 也可以在gcc 中使用。
    • @jonsca- 啊,我不知道!感谢您指出这一点。
    【解决方案3】:

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

    struct Foo {
      char c1;
      int i1;
    };
    

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

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

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

    【讨论】:

    • 非常感谢 erik 的帮助...但是你能帮我解决这段代码并在此代码的上下文中解释相同的概念吗#include /* Size of int 是 4 个字节 */ # pragma pack(2) struct SIZE { int i;字符 ch ;双分贝; } main () { printf ("%d\n",sizeof(struct SIZE)); }
    • 结构将是:4 字节 int,1 字节 char,1 字节填充,sizeof(double) 字节 double - 所有成员字段对齐,以便它们与结构开头的偏移量可被 2 整除.
    【解决方案4】:

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

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

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

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

    对于 MS VS 6.0:请参阅 Here

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2014-05-10
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2016-01-30
      • 2012-08-01
      相关资源
      最近更新 更多