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