2014-01-07 56 views
1

我有一個9字節值的成員結構。該結構的sizeof()返回爲10.我假設額外的字節是由於填充。 是否允許填充字節用於任何事情,還是編譯器「保留」它?也就是說,就程序而言,內存是否永遠丟失?填充結構內存使用情況

問題的原因是我的空間非常短缺,所以我使用位操作在一個字節中使用了其中一個成員來存儲多個值。然而,如果填充的字節從未被另外使用,我可以通過在不增加結構的整體大小的情況下具有額外的字節值來代替填充的字節來降低訪問位操縱的字節中的至少一個值的複雜度。 但如果可能,我寧願回收填充的空間用於其他變量。助教。

typedef struct node { 
    struct node * sibling, *child; // 2 * 2 bytes 
    char * name; // 2 bytes 
    handle callback; // 2 bytes 
    uint16_t properties; // 1 byte 
} node; // total by members = 9 bytes 

totalSizeOfnode = sizeof(node); //totalSizeOfNode = 10 
+0

您可以在結構的末尾添加一個「char」字段,並在其中存儲任何您想要的內容。它不會改變'sizeof'或內存需求。但是你的田地長度真的很奇怪。 'sizeof uint_16t should == 2',並且,根據平臺的不同,'sizeof void * should == 4 or 8' –

+3

爲什麼你認爲uint16_t的大小是1字節? – urzeit

+0

它在我目前正在使用的uC上執行:) – Toby

回答

4

您的問題的答案是否定的,它不會被使用。一個結構體的成員通常對齊以最適合它所運行的底層體系結構。另一方面,大多數編譯器將不得不選擇控制這種打包,所以如果內存不足,可以告訴編譯器將結構成員打包在一個字節邊界上。請注意,這可能會降低性能,因爲CPU可能需要執行多次讀取以獲取跨越單詞邊界的成員。

+0

提及編譯器選項+1。 –

+1

我在嵌入式程序中使用了'#pragma pack(1)'。 –

+0

:(該編譯指示不適用於我的平臺) – Toby

1

如果您更改結構以使填充不再需要或現在被適當大小的成員佔用,則填充空間將來總是可用。

如果你想到編譯器的工作方式,那麼這個空間就不會永遠丟失,因爲編譯器沒有記憶過去的源代碼 - 它只知道它現在是怎麼回事。

+0

啊,在我'永遠失去'的時候,我的意思是程序的生命週期,即當程序運行並且字節被填充時,會有其他變量,結構,放在這些'備用'字節中? – Toby

+1

啊,沒錯 - 不會重用 - 因爲如果你像填充結構的memset那樣做了,它會被銷燬。 –