标准::矢量内部
std::vector internals
如何使用什么数据结构实现std::vector
?当我写作时
void f(int n) {
std::vector<int> v(n);
...
}
向量是否v
堆栈上分配?
vector
对象将在堆栈上分配,并在内部包含指向堆上元素开头的指针。
堆上的元素使vector
类能够按需增长和收缩。
而将vector
放在堆栈上会使对象在超出范围时被破坏。
关于您的[]
问题,vector
类重载了[]
运算符。我会说在内部,当你做array[1]
时,它基本上是做这样的事情:
return *(_Myfirst+ (n * elementSize))
vector
使用_Myfirst
跟踪其内部堆的开始。
当您的vector
开始填满时,它将为您分配更多内存。一种常见的做法是每次将所需的内存量加倍。
请注意,vector
继承自 _Vector_val
,其中包含以下成员:
pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
_Alty _Alval; // allocator object for values
您的v
在自动内存中分配。(俗称堆栈,是的)
未指定实现详细信息,但最常见的是使用动态数组实现,如果您尝试添加的元素多于先前分配可以容纳的元素,则会调整该数组的大小。
该标准仅指定接口(它应该具有哪些方法)和执行时间边界。
由于vector
是模板,因此实现是可见的,因此请找到<vector>
文件并开始检查。
void f(int n) {
std::vector<int> v(n);
...
}
上面的向量具有自动存储持续时间,并在堆栈上分配。但是,向量管理的数据数组是在堆上分配的。
向量的内部是特定于实现的,但典型的实现将包含 3 个指针;每个指针用于跟踪数组的开始、向量的大小和向量的容量。
相关文章:
- 将函数类成员映射到类本身内部
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 标准::shared_ptr内部,弱计数超出预期
- C 标准:DO命名空间constexpr变量具有内部链接
- 是否有有效的标准算法来栅格化面,包括其内部区域
- 复制有状态分配器:标准库分配器语义和内部内存
- RIOS X Mavericks上使用clang++构建的内部示例在链接上找不到STL标准库
- 内部 STL 容器结构能否在下一个标准中发生变化?
- 标准::矢量内部
- 检查指针是否指向标准 C/C++ 中的数组内部
- 标准::移动 - 标准::内部指针