4

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

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

where sizeof(SETUPDATA) = 256 bytes

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

4

3 回答 3

7

您可以使用工会

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

或类似的东西。这样可以确保它至少为 256,但前提是 your_data 不大。

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

于 2013-06-04T23:52:36.303 回答
4

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

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

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

于 2013-06-04T23:53:19.903 回答
2

您首先要问自己的是,为什么您的应用程序会关心struct大小是否发生变化。这表明对未来变化的脆弱性,并且通过允许应用程序在面对结构大小变化时无缝工作,您的设计可能会得到更好的服务。

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

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

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

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

    Impl impl_;
    unsigned char pad_[256 - sizeof(Impl)];
};
于 2013-06-05T00:06:28.980 回答