2015-07-03 75 views
0

我有多少數據的結構體在它:長陣列的大結構:更喜歡堆或堆棧分配?

struct myStruct 
{ 
    char name[128], desc[128]; 
    struct Prm { char p_name[32]; int p_val; } parameter[512]; 
    char Reserved[256]; 
}; 

整個結構的尺寸,如圖所示在上述例子中,是18944個字節假定沒有填充;我需要其中的128個,總計2424832個字節,大於2兆字節。

我需要在全局範圍內聲明這個數組,分配它的最好方法是什麼? 我應該做myStruct myData[128];還是聲明它是一個指針,然後用new[]然後delete[]初始化它,當程序退出時呢?或者也許是矢量?

將聲明它爲一個簡單的數組與堆棧混亂?我怎樣才能確定它沒有問題?從列表中

+0

'保留[256];'?有一種類型缺失。注意:你不應該假設沒有添加填充。某些PCS在結構中爲32位數據類型使用64位對齊方式。 – Olaf

+0

是的,忘記輸入。糾正。那雖然沒有回答我的問題。我的例子中沒有添加填充,我只是測試了它。 –

+0

是的,確實有效,我只是問這是否是堆棧的問題,因爲myData的內容會大於2 Mb。 –

回答

3

更好的選擇是std::vector<>

+0

這取決於具體情況。只是在不知道所有細節的情況下提出「這更好」是無稽之談。不過,它是**選項**。 – Olaf

2

風險大陣列被破壞你的籌碼。全局變量不在堆棧中,所以沒關係。

+0

「......但在數據段」:嗯,只有在明確初始化的情況下(以及僅當某些編譯器/選項不爲零時)。否則,它們會被壓縮到'.bss'中。主要區別在於'.data'使用磁盤(或其他)空間,而'.bss'在程序啓動時創建, – Olaf

+0

@Olaf我*知道*有人會咬我這個:p //我不能在運行時查找包含.bss和.data的* RAM *段的「官方」名稱。 – Quentin

+0

在運行時,它們通常是一個接一個地打包(通常只是從一開始,接着是堆)。 AFAIK,沒有該區域的實際名稱(RAM沒有可讀/可寫RAM的段)。如果你想命名它,我只需將它稱爲全局變量,而不是_stack_和_heap_或任何其他區域(例如在嵌入式系統上)。對不起,有點挑剔,但這主要是關於磁盤空間。對於嵌入式MCU,例如如果您在閃存中具有初始化值,或者在啓動時清除RAM,則會有很大區別。 – Olaf