如果我全局定义并初始化一个大型矢量,那么它的大小是否会包含在目标文件中?
例如
案例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中),它也将按预期反映在目标文件的大小。 / p>
#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:现在,如果不是初始化的全局数组,而是使用初始化的大型全局向量,那么我期待像 case 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
任何人都可以解释这种行为,为什么初始化的向量不存在于目标文件中,以及如何在运行时初始化全局定义的向量。我想我在这里缺少一些基本的东西。感谢
答案 0 :(得分:10)
std::vector
在运行时在堆上分配其存储空间。如果将一个定义为全局变量,那么它的构造函数将在main()
开始之前的某个时间运行。使用您提供的参数,构造函数将为堆上的SIZE
个字符分配空间,然后运行循环以将字母c
存储到每个字符中。
目标文件中存在的所有内容都是传递给向量构造函数的字母c
的单个副本。
答案 1 :(得分:3)
向量类型通常只包含几个指针(三个是常用数字:begin / end / capacity),并根据需要动态分配内存。基本上只有sizeof(std::vector<type>)
将在变量的上下文中,而capacity()*sizeof(type)
将从堆中动态分配。