我目前正在從另一個平臺移植一些代碼,新平臺上的bools是1個字節大小。這是破壞我們的加載代碼,因爲值存儲爲32位值。此外,速度是我們平臺上的一個關鍵問題,我們希望使用32位bools,因爲處理器本地運行在32位,並且需要額外的操作來比較非32位bool。我如何強制海灣合作委員會'bool'的大小
有沒有辦法強制gcc使用32位bools而不是8位bools?
我目前正在從另一個平臺移植一些代碼,新平臺上的bools是1個字節大小。這是破壞我們的加載代碼,因爲值存儲爲32位值。此外,速度是我們平臺上的一個關鍵問題,我們希望使用32位bools,因爲處理器本地運行在32位,並且需要額外的操作來比較非32位bool。我如何強制海灣合作委員會'bool'的大小
有沒有辦法強制gcc使用32位bools而不是8位bools?
您可以創建自己的課程,該課程在內部使用int32_t
,但其行爲如同bool
。這意味着你不得不重新命名你想要使用這種類型的字段,這是更多的工作,但提供了更好的控制和隔離,並且你仍然可以在其他地方使用真實的bool
。我個人更喜歡任何#define hackery,它可能會在某處出乎意料。我還會提醒,不要假設32位的int
會比單個字節更快......其他因素(如流水線,內存延遲,緩存大小等)可能會使差異變得微不足道,甚至會使32位的處理速度變慢,所以你可能想要在你的系統中用代表性的數據處理進行基準測試。
這實際上是我發佈後不久提出的選項。雖然不理想,但比typedef /#define更好,因爲我需要編譯器可識別的類型之間的差異。 – 2010-12-23 14:26:14
#define bool int
這很愚蠢,它會打破太多的東西。 – wilx 2010-12-15 08:15:07
@wilx,如果加載代碼被寫入,以致在太多地方假定bool的大小隻是修復它,那麼代碼已經很愚蠢並且被破壞了。 – 2010-12-15 11:38:49
bool的大小是實現定義的(5.3.3),並且gcc似乎沒有提供在運行時配置它的選項。
希望您的實現定義的代碼是孤立的。如果是這樣,請將您的bool
s更改爲int
s,或更改您的加載代碼以處理sizeof()== 1而不是4.
(或者,對於瘋狂的情況,請將gool視爲bool爲4字節)
編輯:Paul Tomblin的建議使用#define
可能不合法[see here],但它至少在gcc 4.1.2下工作。 [Link]但是,如果您未達到bool
的所有使用情況,那麼尺寸不匹配幾乎肯定會讓您受到影響。
我正在閱讀鏈接問題的答案的方式是,在包含標準頭之前執行'#define bool int'是非法的,但可以在之後執行。你不能期望改變你沒有編譯的代碼中的bools的長度,比如外部(和標準)庫。 – 2010-12-15 03:19:33
@Paul:那麼,如果他們在bool和int上都有專門的模板,你會得到編譯錯誤。 (如'iostream'。)真正的挑戰是,如果'bool'在其代碼庫中如此廣泛地傳播以至於它們不能只是's/bool/int/g',那麼在每個使用'bool'的位置都無法執行'#define'可能是一個真正的問題。 – Bill 2010-12-15 05:46:58
添加#define BOOL_TYPE_SIZE 4
到gcc/config/i386/i386.h
並重新編譯GCC)
您需要將內部數據結構從存儲/加載代碼分開。只需將bools存儲在您的平臺的本地bool
類型的內部數據結構中,並在讀取/寫入數據時從存儲的一個字節布爾值進行適當的轉換。
不幸的是,我只知道Apple的GCC上的-mone-byte-bool開關,但它與你想要的相反。 – 2010-12-15 02:49:48
我想修復你的加載代碼是不可能的? (它真的不應該假設像int或bool這樣的內置類型的大小) – jalf 2010-12-15 08:37:49
原來,加載代碼已經正確處理了大小的差異。問題來自另一部分加載代碼,假定枚舉的大小爲4個字節。這是通過簡單地在那裏有'FORCE_DWORD'值來解決的。 – 2010-12-23 14:28:01