不同类型整数之间的C++算术运算是免费的吗



我有一个项目需要更高的速度和更少的内存消耗,所以我了解了int_fast_t并开始使用它。

同时,我对此有以下问题:
不同类型整数之间的C++算术运算需要隐式强制转换或类似操作吗?还是它们是免费的?

另一种提问方式是,例如,int_fast8_t + int_fast32_t是否比int + int慢?为什么?

C++中的算术运算规则相当疯狂。

https://en.cppreference.com/w/c/language/conversion包含它们。

但在逻辑上,每个操作都要进行高达int/unsigned int的转换。

然后在分配时将结果转换回。

这种逻辑转换不必在实际的机器代码中发生,因此8位int可以在8位硬件中完成,只要转换为int然后返回到8位的结果是相同的;而且可以更快。在其他系统上,这可能代价高昂,而fast 8 int的大小是32位。

性能完全取决于实现。在一种实现方式中,将int_fast8_t转换为int_fast32_t可能涉及开销,并且在某些情况下,向int_fast32_t添加int_fast8_t可能比添加两个int慢。

然而,在另一个实现中,int_fast8_tint_fast32_tint中的每一个都可能是相同的32位有符号整数。在这种情况下,将不存在转换,并且这些类型的任何组合的值的添加都将同样快。

也许需要记住的最大考虑因素是int_fastN_t类型本质上并不比其他整数类型快。它们只是让编译器可以选择使用比请求更多的比特,如果这可以提高性能的话。也许从内存中访问单个字节需要额外的指令,因此16位的值可以比8位的值处理得更快。如果是这样的话,int_fast8_t可能是short的typedef。你不会得到比short更好的性能;所作出的唯一承诺是使用CCD_ 18至少与使用unsigned char一样快。

另一个例子:在今天的计算机上,int_fast64_t很可能是long longtypedef(或等效物(。相同类型,没有性能差异。如果您更关心速度而不是尺寸,请使用int_fastN_t类型,但不要认为您实际上会看到速度提升——您可能已经处于最佳性能。

最新更新