2015-01-08 121 views
2

我讀遊戲引擎架構由Jason格雷戈裏,和我通過一個句子書中困惑:C++如何定義自定義原子數據類型

」 ......大多數遊戲egines定義實現源代碼的可移植性其。自定義的原子數據類型例如,在頑皮狗,我們使用遵循原子數據類型:

* F32是一個32位IEEE-754浮點值

* U8,I8,U16,I16 ,U32,I32,U64和I64分別是無符號數,並分別標記了8,16,32和64位整數...「

我已經看遍了谷歌和網絡試圖找到一種方法來定義這些類型的數據。如果有任何一個環節,書籍或建議,任何人都可以

的#define U8 __int8 等..

:這個通常只使用#define指令來分配這些值的任何值,這樣做提供理解他的意思,或者如何設置它,我將不勝感激。

+3

你也可以使用[typedefs](http://en.wikipedia.org/wiki/Typedef)。這實際上是首選技術。 – BWG

+0

http://en.cppreference.com/w/cpp/atomic/atomic – David

+0

你有什麼問題,_specifically_?如何別名類型?如何獲得固定寬度的整數?如何獲得原子類型?什麼? –

回答

2

使用#define是明確不是在C一個好主意++。即使在C中,您也可以使用typedef作爲類型。

typedef unsigned __int8 U8; 

然而,正如戴維(看他的鏈接完整列表)中提到,你必須在C++中原子的定義,例如:

std::atomic_uint_fast8_t 
// or 
std::atomic<std::uint_fast8_t> 
// with the typedef: 
typedef std::atomic_uint_fast8_t U8; 

然而,如果你想成爲一個有點不太先進,您可以包括cstdint包括,這是在大多數情況下,究竟會在大多數計算機上工作:

#include <cstdint> 

這使你的標準[U] INT [8,16,32,64] _t類型。因此,與上述類型相同:

uint8_t my_var; 
// if you really want to use a typedef: 
typedef uint8_t U8; 
U8 my_var; 

這些類型是便攜式的,不需要額外的typedef。

對於floatdouble,這些通常是便攜。什麼不是反正很少使用的long double。你仍然可以有一個typedef,以防萬一:

typedef float F32; 

然後隨時隨地在你的代碼,你必須使用這些定義,而不是默認的C/C++類型(即charshortintlong是被禁止的。)

把所有那些在報頭,所有其他C++文件包括。


更新:在每個類型

顯然

足夠的內存,如果使用uint8_t,那麼你就可以確保你至少有一個8位數字。它也可能是16位...(某些處理器受到這種限制)同樣,一個uin32_t將至少有32位。

編譯時檢查是否真的需要確認。這使用了帶有模板的sizeof()。在這裏看到:

Compile-time sizeof conditional

請注意,這不是專門針對遊戲。任何編程都應仔細選擇它們的變量類型。越來越多的人正在使用64位整數,以確保它們可以支持2Gb以上的尺寸(如果使用無符號...,則爲4Gb)

僅供參考 - 歐洲阿麗亞娜火箭之一(這是法國的在事故發生時)被炸燬,因爲一個變量是8位,而應該是16位。這讓你知道爲什麼它很重要...

+0

在這本書中,他似乎認爲確保每個數據類型都有適量的內存是非常重要的。我猜如果標準類型是足夠的,我只是不明白他爲什麼要提一提自己提出。 –

+0

@max,因爲這樣的類型('uint8_t'等)並不總是存在。 「原子」也不是。如果你不得不在不同的體系結構上使用不同的線程平臺,你將需要一個通用的包裝器。 – Yakk

+0

是的,Yakk是對的。如果你不得不在舊的控制檯上編程,那麼你可能會被誤認爲只有舊版本的gcc,比如3.x或者更糟,VC6 ......在這種情況下,有一個頭文件定義了你自己的所有U8,U16等會爲你節省很多時間。 –

相關問題