是否有自动将结构填充到最小大小的 C++(或 MSVC)方法?例如,想象下面的伪代码:
#pragma pad(256) // bytes
struct SETUPDATA {
int var1;
double var2;
};
where sizeof(SETUPDATA) = 256 bytes
这里的目标是,在开发过程中,这个结构的成员可以在不改变运行时的足迹大小的情况下改变。
是否有自动将结构填充到最小大小的 C++(或 MSVC)方法?例如,想象下面的伪代码:
#pragma pad(256) // bytes
struct SETUPDATA {
int var1;
double var2;
};
where sizeof(SETUPDATA) = 256 bytes
这里的目标是,在开发过程中,这个结构的成员可以在不改变运行时的足迹大小的情况下改变。
您可以使用工会
struct SETUPDATA {
union { struct your_data; char [256]; }
}
或类似的东西。这样可以确保它至少为 256,但前提是 your_data 不大。
您还可以添加一个简单的断言,然后进行编译器检查assert(sizeof(struct SETUPDATA) == 256)
一种方法是从您的“真实”结构继承并用于sizeof()
构成填充结构,例如:
struct blah_real
{
int a;
};
struct blah : public blah_real
{
private:
char _pad[256 - sizeof(blah_real)];
};
您可以#ifdef DEBUG
只在调试版本中执行此操作,并在发布版本中使用真实结构。
您首先要问自己的是,为什么您的应用程序会关心struct
大小是否发生变化。这表明对未来变化的脆弱性,并且通过允许应用程序在面对结构大小变化时无缝工作,您的设计可能会得到更好的服务。
也许您正在尝试直接序列化数据并且不想面对格式的更改,但在这种情况下,您已经将自己绑定到内存中结构的一种特定表示。例如,支持由于编译器升级或选项而导致的内置类型成员之一的大小更改。
但是,假设您确实想要这样做。
只需将数据包装在一个 impl 中并填充真正的结构:
struct SetupData
{
struct Impl
{
int var1;
double var2;
};
Impl impl_;
unsigned char pad_[256 - sizeof(Impl)];
};