C ++中的全局变量内存分配

时间:2014-04-17 08:20:09

标签: c++ memory memory-management

我有这个测试代码:

#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));
}

如果我运行程序,在32位上使用VS2013编译,在Windows 7上我有以下内存行为:

  1. 内存使用率非常低,在第一个~5秒内几KB。
  2. 内存使用量会增加,直到达到~1 GB
  3. 内存使用率保持在1 GB,持续5秒
  4. 内存使用量跃升至~2 GB并保持约5秒
  5. 内存使用量跃升至~1 GB
  6. 由于我不明白为什么1.和2.正​​在发生,我有几个问题:

    1. 为什么程序不以〜1 GB的内存使用量开始?
    2. 是否按需分配全局变量的内存?
    3. 这是VS / Windows特定行为还是其他编译器/ OS具有相同的行为?
    4. 这种行为是否正确?标准说:
    5.   

      3.7.1静态存储持续时间

           

      没有动态存储持续时间的所有变量都没有   线程存储持续时间,并不是本地有静态存储   持续时间。这些实体的存储应持续一段时间   该计划

           

      3.6.2非局部变量的初始化

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

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

      4.   

1 个答案:

答案 0 :(得分:4)

  

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

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

相关问题