1

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

假设选择了正确的大小,大小的 int (如“ int[size]_t ”)通常比标准int更有效吗?

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

4

2 回答 2

1

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

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

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

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

参考http://en.cppreference.com/w/cpp/types/integer

于 2017-04-18T13:42:05.620 回答
0

假设选择了正确的大小,大小的 int(如“int [size]_t”)通常比标准 int 更有效吗?

取决于您对效率的含义。在内存方面,您知道它们占用了多少空间,因此它们通常更节省内存。还有一些uint_leastn_t类型据说可以用于内存优化(选择可以存储至少n位的最小可用类型)。

在速度方面,对齐的访问可能是一个问题。该int类型通常对应于 CPU 的对齐方式,因此它可能比我们说的要快uint16_t,但这当然是高度系统特定的。

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


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

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

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

于 2017-04-18T13:57:05.117 回答