C ++ Struct - 定义最小大小

时间:2013-06-04 23:46:41

标签: c++ visual-c++ memory-management

是否有自动将结构填充到最小大小的C ++(或MSVC)方法?例如,想象下面的伪代码:

#pragma pad(256) // bytes
struct SETUPDATA {
  int var1;
  double var2;
};

where sizeof(SETUPDATA) = 256 bytes

这里的目标是,在开发过程中,这个结构的成员可以在不改变运行时的占用空间大小的情况下进行更改。

3 个答案:

答案 0 :(得分:6)

您可以使用联合

struct SETUPDATA {
    union { struct your_data; char [256]; }
}

或类似的东西。这确保它至少为256,但只要your_data不大。

您也可以添加一个简单的断言,然后只需编译器检查assert(sizeof(struct SETUPDATA) == 256)

答案 1 :(得分:4)

一种方法是继承你的“真实”结构并使用sizeof()来构成填充结构,例如:

struct blah_real
{
    int a;
};
struct blah : public blah_real
{
private:
    char _pad[256 - sizeof(blah_real)];
};

您可以使用#ifdef DEBUG仅在调试版本中执行此操作,并在发布版本中使用实际结构。

答案 2 :(得分:2)

如果struct尺寸发生变化,您首先要问自己为什么您的应用程序会关注。这表明对未来变化的脆弱性以及您的设计可能会更好地服务,而是允许应用程序在结构大小变化的情况下无缝地工作。

也许您正在尝试直接序列化数据并且不希望面对格式的更改,但在这种情况下,您已经已经将自己绑定到结构中的一个特定表示形式记忆。例如,由于编译器升级或选项,支持其中一个内置类型成员的大小更改。

但是,假设您确实想要这样做。

只需将数据包装在impl中并填充真正的结构:

struct SetupData
{
    struct Impl
    {
        int var1;
        double var2;
    };

    Impl impl_;
    unsigned char pad_[256 - sizeof(Impl)];
};