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

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

软件版本1:

struct Foo
{
    int x;
    int reserve[20]; // unused
};

软件版本2:
struct Foo
{
    int x;
    int y[2];
    int reserve[18]; // unused
};

软件版本3:
struct Foo
{
    int x;
    int y[2];
    int z[5];
    int reserve[13]; // unused
};

显然,未使用的reserve数组仅用于确保所创建结构的任何实例始终占用相同数量的内存,而不管运行的是哪个版本的软件。

我的问题是:对于大型C++项目,这是惯例还是良好惯例?是否有任何一般的(一般意义,非特定于应用程序的)理由要求使用此做法或这样做是有利的?

最佳答案

是的,这是一种常见的做法。我不能说这是好事还是坏事,因为这要视情况而定。

  • 如果您的结构表示某种类型的数据包或数据
    某些规范中的字段,这些字段通常具有保留字段。
    有时,当开发规范的新版本时,
    保留字段用于有意义的事情。我曾与
    符合PCIe规范,这种情况发生了两次。
  • 如果您希望能够向网络中添加一些新数据
    数据包,但您希望旧版本的客户端能够读取该数据包
    数据包就像旧版本一样,这可能是合理的
    有时解决。

  • 当然,您在执行此操作时必须小心,因为将来将来某个时候(通常是在您从未想到的地方)会用完保留字段。

    关于c++ - C++备用数据以保持对象大小相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46344045/

    10-11 19:36
    查看更多