用户定义类型的全局常量是否对齐



我有一个用户定义的类型(类(TMyClass,它有一个构造函数,允许我创建类的常量实例。如果我评估sizeof(TMyClass),我得到28。

如果我在c++源文件中创建一系列常量

const TMyClass InstantA( /*.. constant initial values here.. */ );
const TMyClass InstantB( /*.. constant initial values here.. */ );
const TMyClass InstantC( /*.. constant initial values here.. */ );

我发现GNU编译器没有将它们放在内存空间中。如果我尝试使用指针(声明为const TMYClass *MyPointer = &InstantA(迭代它们,我会发现当我移动到下一个指针(使用MyPointer++;(时,它并不指向InstantB

此外,如果我使用调试器评估地址(&InstantB&InstantC等(,我会发现它们之间的间隔超过28个字节。

我对此感到惊讶,我期望相同类型的全局变量能够创建";包装在一起";而不是编译器选择的某种对齐方式。

如果我把一系列常数放入一个常数数组中,那么它们就如我所期望的那样被打包了。

问题:当编译器必须打包按顺序定义的全局常量时,规则是什么?

考虑一下标准规定了什么,而不是在某些特定硬件上会发生什么。那么不同对象的记忆地址就没有关系了。通过<对它们进行比较,结果未指明。指向对象的指针只能递增一次,并且不能取消对结果指针的引用。取消引用或增加引用会进一步调用未定义的行为。

指针算术只允许使用指向数组元素的指针。

最新更新