我为一家使用大型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/