代码之家  ›  专栏  ›  技术社区  ›  geza

如何利用尾部填充物?

c++
  •  1
  • geza  · 技术社区  · 6 年前

    看看这个简单的代码:

    struct Foo {
        short a;
        char b;
    };
    
    struct Bar: Foo {
        char c;
    };
    

    使用当前的编译器, sizeof(Bar) 是6。这很正常,因为 sizeof(Foo) 是4,而且 Bar::c 再加上5个字节,因为 Bar 它的排列是2,它的大小是6。

    但是,如果 酒吧 不是标准布局,那么编译器可以 c 进入尾翼 Foo ,所以 尺寸(巴) 会是4。

    实现这一点最惯用的方法是什么(更少的侵入性修改,最清晰的方法)?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Blindy    6 年前

    使用当前的编译器, sizeof(Bar) 是6。

    这是一个事实上错误的假设,即使你可以定义什么是“当前编译器”“标准布局”也是一个毫无意义的术语。

    如果我能正确地理解你想要达到的目标, #pragma pack 就是答案。您可以在类的基础上指示编译器要使用什么字节打包。

    一般来说,对于网络传输,您可能需要使用1的包装,对于其他任何东西(内存操作、存储等),只需让编译器为您执行即可。它通常会将字段填充到字边界上,以获得最大的访问性能(不要与缓存性能混淆)。

        2
  •  1
  •   geza    6 年前

    我找到了一个简单的方法:

    struct Empty { };
    
    struct Foo: Empty {
        short a;
        char b;
    };
    
    struct Bar: Foo {
        char c;
    };
    

    在这里, sizeof(Bar) 是4,而且 Foo 仍然是一个标准的布局类(这不是我的要求,但很高兴有)。