You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

固定大小类存入std::vector时,C++标准是否保障存储对象而非指针?

问题解答:C++ std::vector的元素存储布局标准保障
  • 对于std::vector,C++标准明确保障其存储的是对象实例本身,而非指向对象的间接指针,且该特性和存储的类内部结构无关,只要类大小固定即可。
  • 该连续存储对象的特性,仅适用于std::vector、std::array、std::string这类要求连续内存的标准容器,并非所有标准容器都满足该特性。

标准依据

C标准从C03版本开始就明确规定,std::vector的元素必须存储在连续的内存空间中,对任意合法下标n,都满足&vec[n] == &vec[0] + n的规则。如果vector采用间接指针存储的方案,该等式必然不成立,因此标准直接排除了这种实现的合法性。

类结构对存储布局的影响

vector的存储逻辑只和模板参数类型T的sizeof(T)有关,和T内部的成员结构无关:

  • 你示例中的std::vector<MyStruct>,每个元素占sizeof(MyStruct)字节,内存布局就是你提到的连续的a1, b1, a2, b2...形式,不会有额外的间接层。
  • 你示例中的std::vector<MyStruct2>同理,每个元素是完整的MyStruct2实例,内部的数组成员属于实例本身的一部分,因此内存布局就是连续的f1[0]到f1[9]、f2[0]到f2[9]...的形式,绝对不会出现存储指针、间接访问数组成员的情况。

补充说明

如果你的自定义类内部本身包含指向外部内存的指针成员,这属于类自身的设计逻辑,和vector的存储规则无关:vector仍然会存储类实例本身,类内部指针指向的额外内存由类自己的构造、析构函数管理,不影响vector的元素布局。


内容的提问来源于stack exchange,提问作者Pietro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:45:05