2014-01-06 38 views
2

如果我沒有忽略某些東西,選擇uintmax_t將處理整數大小寫。確定可移植的最具限制性的對齊數據類型

(1)是否有類似的浮點數據類型,如果是,在哪個頭文件中? (它不在我的float.h中)

(2)選擇這兩種數據類型的聯合(假設我們可以回答(1)的肯定答案)應該始終是最嚴格的嗎?

+0

在「確定可移植」中,找到_given_平臺上最嚴格的對齊方式可能無法解決更大的問題。也許一個使用「最具限制性的數據類型」的代碼會有所幫助? – chux

+0

@chux:以書中舊的K&R最終示例:重新創建malloc。他使用的鏈表的標題是與任意選擇的(在他的情況下)「最嚴格的對齊(長)」對齊。「我目前正在閱讀Kerrisk TLIP,並且一個練習是再次實現malloc。我打算利用這個機會盡可能便攜,並像這樣對齊列表。 – gnometorule

+1

謝謝 - 您確定根據§7.22.3確保與'OP_malloc()'對齊1 **內存管理函數**「...適當對齊,以便它可以分配給指向任何類型對象的指針基本對齊要求......「。 – chux

回答

4

正如Eric的回答指出的那樣,C11定義了一個在<stddef.h>max_align_t中具有最大基本對齊的對象類型。

但是,請注意,這可能不會按預期在GCC上正常工作。取自海灣合作委員會的網站:

C標準的第四個版本,被稱爲C11,在2011年作爲ISO/IEC 9899:2011發佈在 中。 GCC已對此標準的 提供了基本完整的支持,使用-std = c11或-std = iso9899:2011啓用。 (雖然在 發展,本標準版本的草案被稱爲C1X。)

如果你不想依靠C11由於其新鮮度和目前缺乏支持,我建議定義與工會所有整數類型,所有浮點類型,一個void指針和一個函數指針:其中之一必須是最嚴格的類型。

+0

不同的指針類型不需要具有相同的對齊要求,儘管它們將在大多數C實現中使用。 –

+0

我在gcc 4.6.3上,-std = c11無法識別。如果沒有其他人指出像(int)intmax_t這樣的浮點數,我想你的建議解決方案就是要走的路。 – gnometorule

+0

@EricPostpischil true,但是對於OP的目的,它的工作原理是:因爲任何數據指針可以轉換爲char *(出於歷史原因)或void *並安全返回,因此這些指針類型具有最嚴格的對齊要求(C:參考手冊6.1節確認它) –

2

具有最大基本對齊方式支持的對象類型是max_align_t,定義在<stddef.h>

我沒有在標準中看到指定聯合的對齊要求的文本必須是其成員的最嚴格的對齊要求。因此,從理論上講,工會可能需要比其成員所需要的更嚴格的協調。我沒有看到這個原因,也不期望C實現會這樣做。通常情況下,聯盟的對齊要求是其成員最嚴格的要求,除非程序明確要求更大程度的對齊(如_Alignas關鍵字)。

+0

'max_align_t'來自C11。 – Palec

+0

這將是完美的;但是當我包含stddef.h時,然後在玩具程序中聲明一個這樣的變量並嘗試打印它,gcc報告未知類型名稱錯誤。想法? – gnometorule

+0

@Palec:C現在是C 2011; 2011標準「取代並取代第二版ISO/IEC 9899:1999」。如果有人想詢問C的早期版本,他們應該明確說明。 –