簡體   English   中英

C ++中的全局變量內存分配

[英]Global variables memory allocation in C++

我有以下測試代碼:

#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上運行32位VS2013編譯的程序,則我將具有以下內存行為:

  1. 內存使用率非常低,在最初的約5秒內只有幾KB
  2. 內存使用量會隨着時間增加,直到達到〜1 GB
  3. 內存使用率持續約1 GB,持續5秒
  4. 內存使用量躍升至〜2 GB,並停留約5秒
  5. 內存使用量躍升至〜1 GB

我不明白為什么1.和2.會發生,所以我有幾個問題:

  1. 為什么程序不以〜1 GB的內存使用量開頭?
  2. 是否按需分配用於全局變量的內存?
  3. 這是VS / Windows特定的行為還是其他編譯器/ OS具有相同的行為?
  4. 這種行為正確嗎? 性病說:

3.7.1靜態存儲期限

所有沒有動態存儲持續時間,沒有線程存儲持續時間並且不是本地變量的變量都具有靜態存儲持續時間。 這些實體的存儲應在程序期間持續進行

3.6.2非局部變量的初始化

  1. 有兩大類命名的非局部變量:具有靜態存儲持續時間(3.7.1)的變量和具有線程存儲持續時間(3.7.2)的變量。 具有靜態存儲持續時間的非局部變量將由於程序啟動而初始化。 具有線程存儲持續時間的非局部變量由於線程執行而被初始化。 在初始化的每個階段中,初始化發生如下。

  2. 在進行任何其他初始化之前,應將具有靜態存儲持續時間(3.7.1)或線程存儲持續時間(3.7.2)的變量進行零初始化(8.5)。

是否按需分配用於全局變量的內存?

鏈接器僅在二進制文件中存儲初始化的數據。 運行時鏈接程序會在運行時為具有靜態存儲持續時間的未初始化數據分配空間,即使這樣,也只有在您開始訪問該數據時才提交物理內存。 有關更多詳細信息,請參見數據段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM