【问题标题】:Global variables memory allocation in C++C++中的全局变量内存分配
【发布时间】: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 位上编译的程序,我有以下内存行为:

  1. 内存使用率非常低,前约 5 秒数 KB
  2. 内存使用量会随着时间的推移而增加,直到达到 ~1 GB
  3. 内存使用量在 5 秒内保持约 1 GB
  4. 内存使用量跃升至约 2 GB 并保持约 5 秒
  5. 内存使用量跃升至 ~1 GB

由于我不明白为什么会发生 1. 和 2. 我有几个问题:

  1. 为什么程序不以 ~1 GB 内存使用量启动?
  2. 是否为全局变量按需分配内存?
  3. 这是 VS/Windows 特有的行为还是其他编译器/操作系统具有相同的行为?
  4. 这种行为正确吗?标准说:

3.7.1 静态存储时长

所有没有动态存储持续时间的变量,没有 线程存储时长,并且不是本地有静态存储 期间。这些实体的存储将持续一段时间 程序的

3.6.2 非局部变量的初始化

  1. 有两大类命名的非局部变量:具有静态存储持续时间 (3.7.1) 的和具有线程存储的 持续时间(3.7.2)。具有静态存储持续时间的非局部变量是 初始化作为程序启动的结果。非本地 具有线程存储持续时间的变量被初始化为 线程执行的结果。在这些阶段的每一个中 初始化,初始化发生如下。

  2. 具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他变量之前进行零初始化 (8.5) 初始化发生。

【问题讨论】:

  • 第一点和第二点可能是因为操作系统不会一次映射所有内存,而是在需要时将其映射到进程的虚拟内存映射中。当您分配堆时,操作系统会立即将所有这些映射到进程中。
  • @Joachim Pileborg 即使在堆上,除非您访问它,否则您不会看到内存消耗。

标签: c++ memory memory-management


【解决方案1】:

是否为全局变量按需分配内存?

链接器仅在二进制文件中存储初始化数据。具有静态存储持续时间的未初始化数据的空间由运行时链接器在运行时分配,即使这样,物理内存也仅在您开始访问该数据时才提交。详情请见data segment。

【讨论】:

  • 我为我的 global_buffer 添加了初始化程序,现在可执行文件有 ~1 GB
  • @Felics 这是当初始化器非零时应该发生的事情,例如int32_t global_buffer[1024][1024][256] = {1};.
  • 是的,这就是我所做的。在运行时,我的行为与问题中描述的行为相同,即使我的可执行文件是 ~1 GB
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多