C++11 如果我将一个向量声明为全局变量,那么向量在哪里分配?

C++11 如果我将一个向量声明为全局变量,那么向量在哪里分配?,c++11,global-variables,stdvector,C++11,Global Variables,Stdvector,各位 我知道向量是动态分配的,所以它在堆上。但我也知道全局变量既不是在堆上也不是在堆栈上分配的。那么向量到底在哪里呢?如果你有 std::vector<int> my_global_vector; std::vector my\u global\u vector; 在全局或命名空间范围内定义(即,在任何函数之外),则对象与所有其他(未初始化的)全局或命名空间变量一起存储在程序的“数据”段中 对象的存储与向量数据的存储是分开的,向量数据实际上是从堆中分配的。如果您有 std::ve

各位

我知道向量是动态分配的,所以它在堆上。但我也知道全局变量既不是在堆上也不是在堆栈上分配的。那么向量到底在哪里呢?

如果你有

std::vector<int> my_global_vector;
std::vector my\u global\u vector;
在全局或命名空间范围内定义(即,在任何函数之外),则对象与所有其他(未初始化的)全局或命名空间变量一起存储在程序的“数据”段中

对象的存储与向量数据的存储是分开的,向量数据实际上是从堆中分配的。

如果您有

std::vector<int> my_global_vector;
std::vector my\u global\u vector;
在全局或命名空间范围内定义(即,在任何函数之外),则对象与所有其他(未初始化的)全局或命名空间变量一起存储在程序的“数据”段中


对象的存储与向量数据的存储是分开的,向量数据实际上是从堆中分配的。

向量本身将放在程序的静态数据部分。这不是堆

但当向量存储元素时,它将为其数据分配一个缓冲区。这将在堆上

有关可能的实现,请参见下文。向量在左边-它不包含任何元素数据。一旦收到存储数据的请求,它将分配一个缓冲区来存储向量的元素。此缓冲区可以动态增长或收缩

static data             | heap
------------------------+---------------------
ptr to start    ------> | first element
size                    | second element
                        | ...

向量本身将被放置在程序的静态数据部分。这不是堆

但当向量存储元素时,它将为其数据分配一个缓冲区。这将在堆上

有关可能的实现,请参见下文。向量在左边-它不包含任何元素数据。一旦收到存储数据的请求,它将分配一个缓冲区来存储向量的元素。此缓冲区可以动态增长或收缩

static data             | heap
------------------------+---------------------
ptr to start    ------> | first element
size                    | second element
                        | ...

谢谢你的回复,但我还是不太明白,缓冲区到底是什么?@DexterLiu缓冲区实际上存储向量元素。我澄清了一点。谢谢你的回复,但我还是不太明白,缓冲区到底是什么?@DexterLiu缓冲区实际上存储向量元素。我澄清了一点。非常感谢您的回复!因此,如果我将这样一个向量声明为全局,它实际上不会占用太多内存,因为它只存储对象。是吗?@DexterLiu向量对象通常只包含两个成员(大小、容量和指向堆分配数据的指针),这并不多。但是不鼓励使用全局变量,试着编写好的代码而不使用全局变量,将向量作为参数传递给需要它的函数。如果您不想复制或放弃其所有权,请通过引用传递。非常感谢您的回复!因此,如果我将这样一个向量声明为全局,它实际上不会占用太多内存,因为它只存储对象。是吗?@DexterLiu向量对象通常只包含两个成员(大小、容量和指向堆分配数据的指针),这并不多。但是不鼓励使用全局变量,试着编写好的代码而不使用全局变量,将向量作为参数传递给需要它的函数。如果您不想复制或放弃其所有权,请按引用传递。