2012-09-07 79 views
3

除非包裝編譯選項或編譯指示被使用,像下面(假設8位炭和16位短)平臺特定放置

struct foo 
{ 
    short a ; 
    char b ; 
    short c ; 
} ; 

代碼將結束與,以據我所知,在我們的產品支持的所有平臺(相當一部分)上的c之前有一個字節的對齊板。

我不記得看到的是沒有把bc之間的對齊填充任何平臺,但試想,一個編譯器可能只是在法律上把ab之間的填充。 (動機:我們在代碼中引入了一些基礎結構,以確保當前寫入磁盤或涉及網絡流的某些結構的二進制兼容性,並且在可能的情況下希望插入明確的填充以便其他開發人員意識到這些數據結構在封面下消耗的額外存儲空間)。

有沒有人知道一個平臺誰是編譯器沒有把對齊填充,如果需要,立即之前將成爲未對齊的成員?

+0

有趣的問題。我很好奇你爲什麼以這種方式問你關於這個C危險區域的問題,你願意分享你的動機嗎? –

+1

如果某個平臺將「short」和「char」對齊到4個字節會怎樣?在未來的平臺上可能有很好的理由,例如:http://gcc.gnu.org/wiki/Atomic/GCCMM/DataRaces – ninjalj

+0

我強烈推薦閱讀[編寫可移植代碼](http://www.hookatooka的.com/WPC /)。使用結構來序列化數據不是一個好主意。包裝和endianess會讓你每一次。 – jszakmeister

回答

3

它不是我知道的任何地方,但MSVC(和gcc,我相信,兼容性)支持#pragma pack允許控制結構打包並允許錯位訪問。

基本上,C結構的字節佈局的任何假設只是要求麻煩。這樣做的代碼也傾向於陷入對字詞排序的假設陷阱,這是絕對是在普通平臺之間不兼容。

+0

'#pragma pack'就是我在'包裝雜記'這個問題上的意思。當'#pragma pack'或等效(邪惡)編譯器選項不被使用時,我對默認行爲感興趣。 –

+1

我重申我的警告:如果您對結構佈局做出假設,您將在未來面臨可怕的可移植性錯誤。不要這樣做。烹飪你的存儲空間,不要泡菜。 –