2015-04-18 67 views
2

gcc documentation他們給出瞭如何整數可以是對齊信息。對於包裝整數能做同樣的事情嗎?__attribute__打包的整數

例如,這是否對不能自動處理不正確對齊數據的系統有效?

typedef uint16_t __attribute__ ((packed)) packed_uint16_t; 

在我的系統它提供:

align.c:7:1:警告: '打包' 屬性被忽略[-Wattributes]

的typedef uint16_t 屬性((包裝))packed_uint16_t;

但我的系統正確處理未對齊的字節,所以我想它會忽略它然後!

這是一個跟進this question

+4

我不知道它甚至意味着打包一個'uintN_t'! – Hurkyl

回答

2

__attribute__((packed))僅適用結構。它規定結構成員之間或之後不應有填充。編譯器仍假定結構本身已正確對齊,但它可能會生成特殊代碼來訪問未對齊的結構成員。

如果你有一個未對齊指針(我不知道你怎麼得到這樣一個指針任何方式),你想可移植性取消對它的引用,可考慮做這樣的事情:

some_type *mptr;      /* misaligned pointer */ 
char *buffer = malloc(sizeof *mptr); /* get some aligned memory */ 
memcpy(buffer, mptr, sizeof *mptr); 
some_type *aptr = (some_type*)mptr; /* pointer to aligned data */ 
+0

所以換句話說,沒有辦法在一行中做到這一點。好吧,非常感謝! 順便說一句,我得到misaligned數據,因爲我正在設計一個微控制器的內存管理器,我希望它都被打包! – vitiral

+0

@GarrettLinux不!請不要有這種對齊的東西存在的原因。只要找出該控制器的最大對齊要求是什麼,並將您返回的緩衝區對齊。它可能是2或4,所以你最多隻會浪費3個字節。說真的,這並不值得,特別是考慮到你的代碼會顯着減慢。 – fuz

+0

哈哈,以及如果你堅持:)我一定會添加選項,以便用戶可以做任何他們想要的 - 但你可能是對的。在真正受限制的系統(16位)上,我假定對齊方式只有2個字節。 – vitiral