固定大小类存入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
相关产品推荐
相关产品推荐

