如果向量是全局定义的,什么时候分配内存空间

when will memory space be allocated if vector is defined globally

本文关键字:什么时候 分配 内存 空间 向量 全局 定义 如果      更新时间:2023-10-16

如果我全局定义并初始化一个大向量,那么它的大小会包含在对象文件中吗?

例如

情况1:如果我有一个未初始化的大型全局数组x,它的大小正确地显示在bss段大小中,但它不会添加到对象文件大小中,因为它是未初始化的数据,这是意料之中的事。

#include <iostream>
#define SIZE 200000000
char x[SIZE];
int main (void)
{
  return 0;
}

$size a.out

text           data            bss            dec            hex        filename
1762            572        200000040        200002374        bebcb46        a.out

$ls-l a.out

-rwxrwxr-x. 1 ur ur 7477 Jan 28 02:52 a.out

情况2:类似地,如果我有一个初始化的大型全局数组,它的大小将包括在数据段中(而不是在bss中),并且它也将按预期反映在对象文件的大小中。

#include <iostream>
#define SIZE 200000000
//remaining entries will be value initialized
char x[SIZE] = { 'a', 'b' };
int main (void)
{
  return 0;
}

$size a.out

text           data            bss            dec            hex        filename
1762        200000600             24        200002386        bebcb52        a.out

$ls-l a.out

-rwxrwxr-x. 1 ur ur 200007533 Jan 28 02:34 a.out

案例3:现在,如果我使用初始化的大全局向量而不是初始化的全局数组,那么我预期会出现类似案例2的行为(obj文件大小包括初始化的数组大小),但我得到以下行为

#include <iostream>
#include <vector>
#define SIZE 200000000
std::vector<char> x(SIZE, 'c');
int main (void)
{
  return 0;
}

$size a.out

text           data            bss            dec            hex        filename
4936            604             48           5588           15d4        a.out

$ls-l a.out

 -rwxrwxr-x. 1 ur ur 13583 Jan 28 02:44 a.out

有人能解释一下这种行为吗?为什么初始化的向量没有出现在对象文件中,以及全局定义的向量是如何在运行时初始化的。我想我错过了一些基本的东西。感谢

std::vector在运行时在堆上分配其存储。如果像这样将一个定义为全局变量,那么它的构造函数将在main()启动之前运行。使用您提供的参数,构造函数将为堆上的SIZE字符分配空间,然后运行一个循环,将字母c存储到每个字符中。

对象文件中的所有内容都是传递给向量构造函数的字母c的单个副本。

向量类型通常只包含几个指针(三个是公共数字:begin/end/capacity),并根据需要动态分配内存。基本上只有sizeof(std::vector<type>)将在变量的上下文中,而capacity()*sizeof(type)将从堆中动态分配。