如果向量成员改变大小,类成员偏移量可以改变吗?

Posted

技术标签:

【中文标题】如果向量成员改变大小,类成员偏移量可以改变吗?【英文标题】:Can a class member offset change if a vector member changes size? 【发布时间】:2020-11-17 03:11:03 【问题描述】:

如果我有这样的课程:

class foo 

    std::vector<int> bar;
    int a;
;

int a 的偏移量会在整个运行时保持不变吗?我的理解是 std::vector&lt;int&gt; bar 可以调整大小,并且向量具有它们包含在连续内存中的项目。如果是这种情况,那么如果bar 在运行时调整大小,那不会改变a 的偏移量吗?

【问题讨论】:

相关***.com/questions/2373189/sizeof-a-vector @fas 该链接实际上与 OP 的问题无关,他们在询问更改矢量成员的大小是否会影响布局。 vector object 的大小不会改变无论向量中有多少(如果有)项目。向量在内部维护的动态序列当然可以改变内存占用,但是向量对象本身作为一个对象将是大小恒定的,因此(a)foo 的任何实例和(b)成员a 的偏移量。 @cigien 这有点像 OP 所要求的:sizeof(对象本身的大小是恒定的,缩进取决于它)和 vector::size @WhozCraig 是的 :) 我只是澄清一下 OP 的要求,因为建议的链接没有涵盖这一点。 【参考方案1】:

在 C++ 中,没有对象在运行时改变其大小——所有完整类型的大小都是已知且恒定的。这反映在 sizeof 运算符的结果是 constexpr 的事实上;它是在编译时确定的。

一个对象包含一个指针,该指针可能在运行时间过程中指向不同大小的内存,这很可能而且确实很常见;但是该内存驻留在其他地方并且与对象无关(除了巧合的事实,即对象中的指针指向它)。特别是,它名义上不是对象的一部分,也不影响其大小。 std::vector 就是这样一个包含指针的类型。该指针指向的位置以及该位置有多少可用内存不会影响矢量对象本身的大小。

【讨论】:

以上是关于如果向量成员改变大小,类成员偏移量可以改变吗?的主要内容,如果未能解决你的问题,请参考以下文章

获取C++类成员变量的地址偏移

静态修饰符会改变java中类成员的访问级别吗?

结构体偏移量(sizeof长度)的简单研究

计算结构体的大小

c_cpp 使用地址偏移量包含N个元素的数组成员计算struct的大小

C / C ++编译器可以报告结构成员偏移量[重复]