如果我将一个向量声明为全局变量,那么该向量分配在哪里?
If i declare a vector as global variable, where is the vector allocated?
大家。
我知道 vector 是动态分配的,所以它在堆上。但我也知道全局变量既不分配在堆上也不分配在堆栈上。那么向量到底在哪里?
如果你有
std::vector<int> my_global_vector;
定义在全局或命名空间范围内(即在任何函数之外),然后 对象 与所有其他对象一起存储在程序的 "data" 段中(未初始化的)全局或命名空间变量。
object的存储与vector数据的存储是分开的,确实是堆分配的。
矢量本身将放在程序的静态数据部分。这不是堆。
但是当向量存储元素时,它会为其数据分配一个缓冲区。这将在堆上。
请参阅下文了解可能的实施方式。矢量位于左侧 - 它不包含任何元素数据。一旦收到存储数据的请求,它将分配一个缓冲区来存储向量的元素。此缓冲区可以动态增长或收缩。
static data | heap
------------------------+---------------------
ptr to start ------> | first element
size | second element
| ...
大家。
我知道 vector 是动态分配的,所以它在堆上。但我也知道全局变量既不分配在堆上也不分配在堆栈上。那么向量到底在哪里?
如果你有
std::vector<int> my_global_vector;
定义在全局或命名空间范围内(即在任何函数之外),然后 对象 与所有其他对象一起存储在程序的 "data" 段中(未初始化的)全局或命名空间变量。
object的存储与vector数据的存储是分开的,确实是堆分配的。
矢量本身将放在程序的静态数据部分。这不是堆。
但是当向量存储元素时,它会为其数据分配一个缓冲区。这将在堆上。
请参阅下文了解可能的实施方式。矢量位于左侧 - 它不包含任何元素数据。一旦收到存储数据的请求,它将分配一个缓冲区来存储向量的元素。此缓冲区可以动态增长或收缩。
static data | heap
------------------------+---------------------
ptr to start ------> | first element
size | second element
| ...