使用哪个 int 实现?

Which int implementation to use?

我正在使用 DirectX 12 API 用 C++ 编写视频游戏引擎。通过这样做,我发现了数据类型 __int64,这显然是 Microsoft 特定大小的类型。因此我想到了两个问题:

大小为 int(如“int[size]_t”)通常比标准 int 更有效正在选择合适的尺码?

AND

"int[size]_t", "__int[size][=25=中的哪种数据类型]" 和 "int[size]" 是否应该使用,考虑到不同计算机系统之间的效率和兼容性?

就我个人而言,我会避免对整数类型使用任何非标准符号,例如 __int64,因为您会放弃可移植性。

标准固定宽度类型可以在<cstdint>中找到。但是编译器不一定必须支持它们,但如果支持它们,则它们必须严格遵守规范:例如std::int32_t 是一个 32 位 2 的补码有符号整数类型。在您的系统上,您可能会发现 __int64std::int64_t 都是 long longtypedef

性能 而言,您可能会发现使用 int 会更好,因为这通常是 CPU 的原生整数类型。 (尽管情况并非总是如此:Turbo C++ 是一个值得注意的例外)。但是,如您所知,int 的规范故意含糊不清。例如,它可以是范围为-32767到+32767的有符号幅度类型。

所以这是便携性和性能之间的折腾。您可能会发现 std::int_fast32_t 让您两全其美。

引用http://en.cppreference.com/w/cpp/types/integer

Are sized int's (like "int[size]_t") generally more efficient than a standard int, assuming the right size is being chosen?

取决于你所说的效率。在内存方面,你知道它们占用多少space,所以它们通常更节省内存。还有 uint_leastn_t 类型据称可用于内存优化(选择可以存储至少 n 位的最小可用类型)。

就速度而言,对齐访问可能是一个问题。 int 类型通常对应于 CPU 的对齐方式,因此它可能比 uint16_t 更快,但这当然是高度系统特定的。

C 标准完全意识到这个问题,所以如果速度是一个问题,你应该使用 cstdint.h 的 uint_fastn_t 类型,例如 uint_fast32_t。然后您将获得至少 n 位的最快类型。


which data type out of "int[size]_t", "__int[size]" and "int[size]" should I use, with efficiency and compatibility between different computer systems in mind?

  • 为了获得最大的可移植性,您应该使用固定大小的类型,例如 uint32_t
  • 为了获得最大的速度效率,您应该使用 "fast" 类型,例如 uint_fast32_t
  • 对于内存效率优化的罕见情况,您可以使用 "least" 类型,例如 uint_least32_t
  • 很少有理由使用 int。这主要是为了向后兼容旧代码。
  • 没有任何理由使用非标准 __int32

语言律师会 post 评论说 stdint.h 不再是强制性的,但没有一个理智的人会使用不支持它的新编译器。