簡體   English   中英

結構數組的動態與 Static memory 分配對比

[英]Dinamically vs Static memory allocation for a struct array

如果你想分配一個結構數組,你可以通過聲明類似的東西來靜態地做到這一點

struct myStruct myStructArray[100]; 

或動態地與類似的東西

struct myStruct *myStructArray = calloc(100, sizeof(struct myStruct) );

但在這種情況下,您有責任釋放 memory。

在許多應用程序和示例中,我發現了一種混合方法:

struct wrapperStruct
{
    int myInt;
    struct myStruct myStructArray[1];
};

然后分配是這樣進行的

int n = 100;
size_t memory_size = sizeof(struct wrapperStruct) + (n - 1) * sizeof(struct myStruct);
struct wrapperStruct *wrapperStruct_p = calloc(1, memory_size);

所以(如果我理解正確的話)因為數組是結構的最后一個成員,並且結構的字段尊重 memory 中的相同 position 那么您正在“擴展”具有 99 個條目的單條目數組myStructArray 這使您可以安全地編寫類似wrapperStruct_p.myStructArray[44]的內容,而不會導致緩沖區溢出,也無需創建動態分配的結構數組,然后在最后處理 memory 處理。 因此,替代方法是:

struct wrapperStruct
{
    int myInt;
    struct myStruct *myStructArray;
};

struct wrapperStruct *wrapperStruct_p = calloc(1, sizeof(struct wrapperStruct) );
wrapperStruct_p.myStructArray = calloc(100, sizeof(struct myStruct) )

問題是當您嘗試釋放wrapperStruct_p變量時會發生什么?

您是否導致 memory 泄漏?

C memory 管理層是否能夠理解結構數組由 100 個條目而不是 1 個組成?

除了不必釋放結構內的指針之外,第一種方法有什么好處?

問題是當您嘗試釋放 wrapperStruct_p 變量時會發生什么?

您是否導致 memory 泄漏?

最有可能,但不是必需的。 內部動態數組的 memory 未被釋放,但如果您將指針地址保存到其他變量,您仍然可以稍后釋放它。

C memory 管理層是否能夠理解結構數組由 100 個條目而不是 1 個組成?

“C memory 管理”負責堆棧和堆分配(后者使用系統調用,所以它可能不是真正的“C memory管理”),除了在匯編程序之上提供語法糖(與垃圾收集不同)之外,它沒有做太多其他事情Java 或其他語言)。

C 本身並不關心某處有多少條目以及您訪問 memory 的哪一部分(SEGFAULTS 是操作系統對 memory 訪問沖突的響應)

除了不必釋放結構內的指針之外,第一種方法有什么好處?

如果通過“第一種方法”您的意思是堆棧分配的數組,那么主要是您不需要分配任何東西並且堆棧會為您完成它(缺點是它仍然在聲明的 scope 中分配並且您無法釋放或增加數組空間)然后恆定的分配速度和保證無論操作系統響應如何,您都將獲得 100 個數組項(許多實時應用程序需要最大響應時間,因此堆分配可能是一個非常大的減速導致問題)。

如果通過“第一種方法”您的意思是使用包裝器結構,那么除了您已經說過的好處之外,我看不到任何好處。

我什至建議您不要提倡/使用這種方法,因為它是一種非常令人困惑的技術,沒有明顯的好處(加上它分配了 1 個空間,即使它甚至可能沒有被使用,但這是一個細節)

主要目標是編寫其他人易於理解的代碼。 機器和編譯器現在可以用代碼創造奇跡,所以除非你是編譯器設計者、標准庫開發者或嵌入式系統的機器級程序員,否則你應該編寫簡單易懂的代碼。

暫無
暫無

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

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