我正在阅读杰森格雷戈里的游戏引擎架构,我对书中的一句话感到困惑:
“...大多数游戏通过定义自己的自定义原子数据类型来实现源代码可移植性。例如,在Naughty Dog中我们使用以下原子数据类型:
* F32是32位IEEE-754浮点值
* U8,I8,U16,I16,U32,I32,U64和I64分别是无符号和8位,16位,32位和64位整数......“
我已经遍布谷歌和网络试图找到一种方法来定义这些类型的数据。这通常是通过使用#define指令将这些值分配给任何值来完成的,如下所示:
#define U8 __int8 等..
如果有任何链接,书籍或建议,任何人都可以提供,以了解他的意思,或如何设置,我将不胜感激。
答案 0 :(得分:2)
在C ++中使用#define
绝对不是一个好主意。即使在C语言中,您也可以使用typedef
作为类型。
typedef unsigned __int8 U8;
然而,正如Dave所提到的(请参阅他的完整列表链接),您在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。
对于float
和double
,这些通常是可移植的。什么不是long double
无论如何都很少使用。你仍然可以有一个typedef,以防万一:
typedef float F32;
然后在代码中的任何地方,您必须使用这些定义,而不是默认的C / C ++类型(即char
,short
,int
,long
是被禁止的。 )
将所有这些放在所有其他C ++文件包含的标题中。
更新
每种类型的内存足够
显然,如果你使用uint8_t
,那么你可以确定你至少有一个8位数。它也可能是16位......(某些处理器受此限制)同样,uin32_t
至少有32位。
如果你真的想确定,可以进行编译时检查。这样可以将sizeof()
与模板结合使用。见这里:
Compile-time sizeof conditional
请注意,这并非特定于游戏。任何编程都应该仔细选择它们的变量类型越来越多的人正在使用64位整数来确保它们可以支持超过2Gb的大小(如果您使用未签名的话,则为4Gb)。
仅供参考 - 其中一枚欧洲阿丽亚娜火箭(在事故发生时它是法国人)因为一个变量是8位而应该是16位而被炸毁了。这让你知道为什么它很重要......