除非包裝編譯選項或編譯指示被使用,像下面(假設8位炭和16位短)平臺特定放置
struct foo
{
short a ;
char b ;
short c ;
} ;
代碼將結束與,以據我所知,在我們的產品支持的所有平臺(相當一部分)上的c
之前有一個字節的對齊板。
我不記得看到的是沒有把b
和c
之間的對齊填充任何平臺,但試想,一個編譯器可能只是在法律上把a
和b
之間的填充。 (動機:我們在代碼中引入了一些基礎結構,以確保當前寫入磁盤或涉及網絡流的某些結構的二進制兼容性,並且在可能的情況下希望插入明確的填充以便其他開發人員意識到這些數據結構在封面下消耗的額外存儲空間)。
有沒有人知道一個平臺誰是編譯器沒有把對齊填充,如果需要,立即之前將成爲未對齊的成員?
有趣的問題。我很好奇你爲什麼以這種方式問你關於這個C危險區域的問題,你願意分享你的動機嗎? –
如果某個平臺將「short」和「char」對齊到4個字節會怎樣?在未來的平臺上可能有很好的理由,例如:http://gcc.gnu.org/wiki/Atomic/GCCMM/DataRaces – ninjalj
我強烈推薦閱讀[編寫可移植代碼](http://www.hookatooka的.com/WPC /)。使用結構來序列化數據不是一個好主意。包裝和endianess會讓你每一次。 – jszakmeister