【问题标题】:C++ Class packing / member alignmentC++ 类打包/成员对齐
【发布时间】:2017-11-01 09:26:54
【问题描述】:

我知道结构打包在 C++ 编程中很常见(至少在低内存系统上)。但是上课呢。 我知道它有效,因为我试过了

#include <iostream>

#pragma pack(push, 1)
class Test_Packed {
    uint8_t t;
    uint32_t test;
};
#pragma pack(pop)

class Test_Unpacked {
    uint8_t t;
    uint32_t test;
};

int main() {
    std::cout<<sizeof(Test_Packed) << " / " << sizeof(Test_Unpacked)<<std::endl;
    return 0;
}

正确输出“5 / 8”。

我可以假设所有符合标准的编译器都是这种情况,还是定义了这个实现?

我知道添加虚拟成员(因此需要一个 vtable)会在前面添加额外的数据。失败的其他原因是什么?

除了在某些平台上性能不佳之外,这会导致任何问题吗?

【问题讨论】:

  • 它的实现已定义。
  • 这个问题本身就是正确的#pragma pack 用法和语法的一个很好的演示。正是我在寻找如何使用#pragma pack
  • 请记住,在 C++ 中,struct 只是一个类,如果没有另外指定,所有成员默认为 publicclass 只是一个类/结构,其中所有成员除非另有说明,否则默认为private,因此在我看来,更严格地仅将所需成员打包在类或结构中,而不是像您所做的那样将整个类或结构打包,同样会影响类或结构。跨度>

标签: c++ class memory-alignment packing


【解决方案1】:

#pragma 的文档指出:

实现定义的行为由#pragma 指令控制。

所以#pragma pack(push, 1)#pragma pack(pop) 的效果(如果有的话) 是完全“定义的实现。”

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2023-01-17
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多