代码之家  ›  专栏  ›  技术社区  ›  Alexander Rafferty

类连续数据

  •  6
  • Alexander Rafferty  · 技术社区  · 14 年前

    我有一个C++类,它有四个私有浮点和一组非静态公共函数,这些函数在这个数据上运行。

    是否有保证,或者是否有可能保证四个浮点是连续的,并且没有填充。这将使类的大小为四个浮点,它的地址将是第一个浮点的地址。

    3 回复  |  直到 12 年前
        1
  •  8
  •   Frédéric Hamidi    14 年前

    这取决于编译器。

    你可以用 #pragma pack(1) 例如, MSVC gcc #pragma pack 1 具有 aCC .

    例如,假设 MSVC / gcc :

    #pragma pack(1)
    class FourFloats
    {
        float f1, f2, f3, f4;
    };
    

    或者更好:

    #pragma pack(push, 1)
    class FourFloats
    {
        float f1, f2, f3, f4;
    };
    #pragma pack(pop)
    

    它基本上禁用了填充,并保证 floats 是连续的。但是,为了确保类的大小 4 * sizeof(float) ,它不能有 vtbl ,也就是说 virtual members 是禁区。

        2
  •  9
  •   Charles Salvia    12 年前

    C++标准保证 数组 是连续存储的,没有中间填充。如果要确保浮动是连续的,并且不希望依赖于编译器特定的填充指令,可以简单地将浮动存储在数组中:

    private:
    float array_[4];
    

    但是,这并不一定保证类将是四个浮点的大小。但是,您可以确保专门针对浮动内部数组的任何操作都将在连续数组上操作。

    但更一般地说,也许你应该质疑为什么你需要这个保证。通常,您关心类的内存布局的唯一原因是将其视为序列化字节数组。在这种情况下,通常最好创建专用的序列化/反序列化函数,而不是依赖于任何特定的内存布局。

        3
  •  3
  •   vitaut    14 年前

    你可以用 #pragma pack 描述 here here 为了这个。