【问题标题】:Which int implementation to use? [duplicate]使用哪个 int 实现? [复制]
【发布时间】:2017-04-18 13:38:02
【问题描述】:

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

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

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

【问题讨论】:

  • 在 MS 编译器上 __int64long longstd::int64_t 完全相同。它只是在后者被添加到标准之前存在的一个名称。
  • 很抱歉重复发布。感谢您的快速回复
  • @BoPersson 相反,这是 MS 提出的一个名称,因为他们从 1999 年直到最近才遵循之前的 C 标准。
  • MS Visual C++ 早在 VS 2010 中就开始实现现在所谓的 C++11,其中包括 stdint.hcstdint.h。 MS Visual C++ 已明确声明“C99”支持不是目标,但由于最终的 C++11 标准规定 C++11 必须包含 C99 标准库,因此这些是 VS 2013 和更高版本库实现的一部分。同样,MS Visual C++ 还不支持 C11 标准库,但预计这将成为 C++17 标准的一部分。尽管委员会试图让 C 和 C++ 保持密切联系,但它仍然与所有 C99/C11 语言特性不同。
  • 基于这个问题,我猜你可能是 C++ 和/或 DirectX 的新手。请记住,DirectX 12 是一种专家图形 API,它假定您已经是使用 DirectX 11 的大师。如果您不是,您应该考虑改用 DirectX 11。请参阅DirectX Tool Kit tutorials

标签: c++ types directx-12


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 由于您专门编写 DirectX 12 引擎,因此您无需担心 int32_tuint32_t 的“奇怪”实现。 DirectX 12 仅在所有使用 32 位整数的 Windows 平台上受支持(x64 和 ARM64 使用 LLP64,它仅将指针扩展为 64 位,请参阅MSDN
  • 一般来说,除非您要创建的结构必须匹配磁盘上的二进制文件、网络数据包、跨越 ABI 边界或有 64 位大小要求,否则在 Microsoft 平台上通常最有效的方式是坚持与intunsigned int。对于 C++ 编程,您还应该知道何时使用 size_tptrdiff_t 是合适的。
【解决方案2】:

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

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

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

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


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

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

语言律师会发布 cmets 说 stdint.h 不再是强制性的,但任何理智的人都不会使用不支持它的新编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2014-05-05
    • 2011-04-19
    • 2013-05-26
    • 1970-01-01
    • 2015-06-02
    • 2013-07-05
    相关资源
    最近更新 更多