C++备用数据以保持对象大小相同?

Ima*_*889 2 c++ memory

我在一家使用大型C++项目来自动化制造过程的公司工作,在查看C++源代码的修订历史时,我注意到了以下特殊行为.

下面显示了软件的不同版本中此行为的简化示例.

软件修订版1:

struct Foo
{
    int x;
    int reserve[20]; // unused
};
Run Code Online (Sandbox Code Playgroud)

软件修订版2:

struct Foo
{
    int x;
    int y[2];
    int reserve[18]; // unused
};
Run Code Online (Sandbox Code Playgroud)

软件修订版3:

struct Foo
{
    int x;
    int y[2];
    int z[5];
    int reserve[13]; // unused
};
Run Code Online (Sandbox Code Playgroud)

很明显,未使用的reserve数组就是为了确保创建的结构的任何实例总是占用相同数量的内存,而不管软件的哪个版本正在运行.

我的问题是:对于大型C++项目,这是常见的做法和/或良好做法吗?是否有任何一般性(一般意义,非特定应用)原因使用这种做法是必需的还是有利的?

Rin*_*dov 7

是的,这是一种常见的做法.我不能说这是好事还是坏事,因为它取决于.

  • 如果您的结构表示某种类型的数据包或来自某些规范的数据字段,那么这些数据通常具有保留字段.有时,当开发新版本的规范时,那些保留字段用于某些有意义的事情.我使用PCIe规范合规,这发生了几次.
  • 如果您希望能够为您的网络数据包添加一些新数据,但您希望旧版本客户端能够像旧版本一样读取该数据包,这有时可能是一种合理的解决方案.

当然,在做这件事时你必须要小心,因为你将来某个时候可能会用完保留字段,通常是在你从未想过的地方.