如果向量是全局定义的,什么时候分配内存空间
when will memory space be allocated if vector is defined globally
如果我全局定义并初始化一个大向量,那么它的大小会包含在对象文件中吗?
例如
情况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)
将从堆中动态分配。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 什么时候为程序分配内存
- malloc 分配的内存在什么时候获得类型
- 我什么时候应该首选写入组合 CUDA 分配的映射主机内存
- std::d eque 什么时候需要重新分配
- 如果向量是全局定义的,什么时候分配内存空间
- 在c++中,通常在什么时候为局部变量分配内存?
- 什么时候由new分配内存