【发布时间】:2014-04-17 16:31:56
【问题描述】:
我有这个测试代码:
#include <thread>
#include <cstdint>
#include <cstdlib>
int32_t global_buffer[1024][1024][256];
int main()
{
std::this_thread::sleep_for(std::chrono::seconds(5));
for (size_t i = 0; i < 1024; ++i)
for (size_t j = 0; j < 1024; ++j)
for (size_t k = 0; k < 256; ++k)
global_buffer[i][j][k] = rand();
std::this_thread::sleep_for(std::chrono::seconds(5));
int32_t* heap_buffer = new int32_t[1024 * 1024 * 256];
for (size_t i = 0; i < 1024 * 1024 * 256; ++i)
heap_buffer[i] = rand();
std::this_thread::sleep_for(std::chrono::seconds(5));
delete[] heap_buffer;
std::this_thread::sleep_for(std::chrono::seconds(5));
}
如果我在 Windows 7 上运行使用 VS2013 在 32 位上编译的程序,我有以下内存行为:
- 内存使用率非常低,前约 5 秒数 KB
- 内存使用量会随着时间的推移而增加,直到达到 ~1 GB
- 内存使用量在 5 秒内保持约 1 GB
- 内存使用量跃升至约 2 GB 并保持约 5 秒
- 内存使用量跃升至 ~1 GB
由于我不明白为什么会发生 1. 和 2. 我有几个问题:
- 为什么程序不以 ~1 GB 内存使用量启动?
- 是否为全局变量按需分配内存?
- 这是 VS/Windows 特有的行为还是其他编译器/操作系统具有相同的行为?
- 这种行为正确吗?标准说:
3.7.1 静态存储时长
所有没有动态存储持续时间的变量,没有 线程存储时长,并且不是本地有静态存储 期间。这些实体的存储将持续一段时间 程序的
3.6.2 非局部变量的初始化
有两大类命名的非局部变量:具有静态存储持续时间 (3.7.1) 的和具有线程存储的 持续时间(3.7.2)。具有静态存储持续时间的非局部变量是 初始化作为程序启动的结果。非本地 具有线程存储持续时间的变量被初始化为 线程执行的结果。在这些阶段的每一个中 初始化,初始化发生如下。
具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他变量之前进行零初始化 (8.5) 初始化发生。
【问题讨论】:
-
第一点和第二点可能是因为操作系统不会一次映射所有内存,而是在需要时将其映射到进程的虚拟内存映射中。当您分配堆时,操作系统会立即将所有这些映射到进程中。
-
@Joachim Pileborg 即使在堆上,除非您访问它,否则您不会看到内存消耗。
标签: c++ memory memory-management