我讀到結(jié)構(gòu)中位字段的順序是特定于平臺的。如果我使用不同的特定于編譯器的打包選項,這將保證數(shù)據(jù)在寫入時以正確的順序存儲嗎?例如:struct Message{ unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6;} __attribute__ ((__packed__));在具有GCC編譯器的英特爾處理器上,字段在顯示時顯示在內(nèi)存中。Message.version是緩沖區(qū)中的前3位,然后Message.type是。如果我找到各種編譯器的等效結(jié)構(gòu)包裝選項,這將是跨平臺的嗎?
3 回答

慕容3067478
TA貢獻1773條經(jīng)驗 獲得超3個贊
不,它不是完全便攜的。結(jié)構(gòu)的包裝選項是擴展,并且它們本身不是完全可移植的。除此之外,C99§6.7.2.1第10段說:“單位內(nèi)的位域分配順序(從高階到低階或低階到高階)是實現(xiàn)定義的?!?/p>
例如,即使是單個編譯器也可能根據(jù)目標平臺的字節(jié)順序不同地放置位字段。

青春有我
TA貢獻1784條經(jīng)驗 獲得超8個贊
從編譯器到編譯器,位字段差異很大,抱歉。
對于GCC,大端機器首先布置了大端,而小端機器首先布置了小端。
K&R說“結(jié)構(gòu)的相鄰[bit-]字段成員在依賴于實現(xiàn)的方向上被打包到依賴于實現(xiàn)的存儲單元中。當另一個字段后面的字段不適合時...它可以在單元之間分割,或者單元可以是寬度為0的未命名字段強制填充......“
因此,如果您需要與機器無關的二進制布局,則必須自己完成。
最后一個語句也適用于填充引起的非位域 - 但是所有編譯器似乎都有一些強制結(jié)構(gòu)字節(jié)打包的方法,正如我在GCC中發(fā)現(xiàn)的那樣。
- 3 回答
- 0 關注
- 711 瀏覽
添加回答
舉報
0/150
提交
取消