使用哪个 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 的补码有符号整数类型。在您的系统上,您可能会发现 __int64
和 std::int64_t
都是 long long
的 typedef
。
就 性能 而言,您可能会发现使用 int
会更好,因为这通常是 CPU 的原生整数类型。 (尽管情况并非总是如此:Turbo C++ 是一个值得注意的例外)。但是,如您所知,int
的规范故意含糊不清。例如,它可以是范围为-32767到+32767的有符号幅度类型。
所以这是便携性和性能之间的折腾。您可能会发现 std::int_fast32_t
让您两全其美。
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 不再是强制性的,但没有一个理智的人会使用不支持它的新编译器。
我正在使用 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 的补码有符号整数类型。在您的系统上,您可能会发现 __int64
和 std::int64_t
都是 long long
的 typedef
。
就 性能 而言,您可能会发现使用 int
会更好,因为这通常是 CPU 的原生整数类型。 (尽管情况并非总是如此:Turbo C++ 是一个值得注意的例外)。但是,如您所知,int
的规范故意含糊不清。例如,它可以是范围为-32767到+32767的有符号幅度类型。
所以这是便携性和性能之间的折腾。您可能会发现 std::int_fast32_t
让您两全其美。
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 不再是强制性的,但没有一个理智的人会使用不支持它的新编译器。