我正在使用 DirectX 12 API 用 C++ 编写视频游戏引擎。通过这样做,我发现了数据类型__int64,它显然是 Microsoft 特定大小的类型。于是我想到了两个问题:
假设选择了正确的大小,大小的 int (如“ int[size]_t ”)通常比标准int更有效吗?
和
考虑到不同计算机系统之间的效率和兼容性,我应该使用“ int[size]_t ”、“ __int[size] ”和“ int[size] ”中的哪种数据类型?
我正在使用 DirectX 12 API 用 C++ 编写视频游戏引擎。通过这样做,我发现了数据类型__int64,它显然是 Microsoft 特定大小的类型。于是我想到了两个问题:
假设选择了正确的大小,大小的 int (如“ int[size]_t ”)通常比标准int更有效吗?
和
考虑到不同计算机系统之间的效率和兼容性,我应该使用“ int[size]_t ”、“ __int[size] ”和“ int[size] ”中的哪种数据类型?
就我个人而言,我会避免使用任何非标准符号来表示整数类型,例如__int64
,因为您放弃了可移植性。
可以在 中找到标准的固定宽度类型<cstdint>
。但是编译器不一定必须支持它们,但如果它们支持,那么它们必须严格遵守规范:例如std::int32_t
,是 32 位 2 的补码有符号整数类型。在您的系统上,您可能会发现__int64
和std::int64_t
都是typedef
.long long
在性能方面,您可能会发现使用 会更好int
,因为这通常是 CPU 的原生整数类型。(尽管情况并非总是如此:Turbo C++ 是一个值得注意的例外)。但是,如您所知,an 的规范int
是故意含糊的。例如,它可以是范围为 -32767 到 +32767 的有符号幅度类型。
所以这是可移植性和性能之间的折腾。您可能会发现这可以std::int_fast32_t
让您两全其美。
假设选择了正确的大小,大小的 int(如“int [size]_t”)通常比标准 int 更有效吗?
取决于您对效率的含义。在内存方面,您知道它们占用了多少空间,因此它们通常更节省内存。还有一些uint_leastn_t
类型据说可以用于内存优化(选择可以存储至少n位的最小可用类型)。
在速度方面,对齐的访问可能是一个问题。该int
类型通常对应于 CPU 的对齐方式,因此它可能比我们说的要快uint16_t
,但这当然是高度系统特定的。
C 标准完全意识到这个问题,所以如果速度是一个问题,你应该使用uint_fastn_t
cstdint.h 的类型,例如uint_fast32_t
. 然后,您将获得至少n位的最快可能类型。
考虑到不同计算机系统之间的效率和兼容性,我应该使用“int[size]_t”、“__int[size]”和“int[size]”中的哪种数据类型?
uint32_t
.uint_fast32_t
.uint_least32_t
.int
. 这主要是为了向后兼容旧代码。__int32
。语言律师会发表评论说 stdint.h 不再是强制性的,但没有理智的人会使用不支持它的新编译器。