C ++中CPU使用率较低:声明为unsigned int或不是?

时间:2009-12-26 23:14:23

标签: c++ c optimization

什么需要最多的CPU:

int foo = 3;

或将其类型转换为unsigned int?

unsigned int foo = 3;

9 个答案:

答案 0 :(得分:18)

它们都由内存中的相同位表示。这只是一个如何解释位的问题,这取决于你想要的值的范围。所以,两者都不是更加密集。

至于处理数字,以乘法为例:我不是专家,但是根据wikipedia,在x86中有无符号乘法(mul)和有符号乘法({的操作码。 {1}})这意味着它们可能需要相同的时间。

答案 1 :(得分:10)

这是在MS VC 2005中生成的程序集:

; 9    :    int foo = 3;

    mov DWORD PTR _foo$[ebp], 3

; 10   :    unsigned int bar = 3;

    mov DWORD PTR _bar$[ebp], 3

没有区别:)

答案 2 :(得分:5)

CPU使用率没有差异。

实际上,您几乎可以保证这些声明将编译为相同的代码。

唯一的区别是编译器会记住变量是signed还是unsigned,并决定如何实现比较等操作或决定调用哪些重载函数。

答案 3 :(得分:3)

我的想法是:它没有将int转换为unsigned int。所以速度没有区别。 here是关于快速类型的链接。然而,更多的算法和功能应该优化而不是类型。

答案 4 :(得分:1)

在此示例中,根本没有成本差异。

答案 5 :(得分:1)

当你做分工。 使用unsigned intint快。 (当然,实际上不需要减去。)

答案 6 :(得分:0)

没有区别。您可以通过查看生成的汇编语言来判断。即使存在差异,您应该意识到这是微优化,并且正确地考虑这一点是在完成所有宏优化之后,这是您的工作,而不是编译器的工作。

答案 7 :(得分:0)

在没有指定签名的情况下声明普通int原则上应该让编译器知道在大小和签名方面可以自由选择最自然的整数。但实际上,现代桌面处理器没有速度差异(尽管可能在某些嵌入式系统上)。

答案 8 :(得分:0)

您通常不会注意到实践中的任何差异,因此在我看来,最佳做法是根据应该表示的值的应用程序特定语义选择类型:使用无符号类型表示无符号数量;签名相同。虽然有些人反对这种理念,但他们更愿意尽可能地int使用unsigned int而只需要{{1}}。

至于实际性能,如果您仍然关注它,它当然取决于编译器和硬件平台。例如,有一点可以想到,C / C ++所需的有符号整数除法的语义(向零舍入)通常不同于硬件平台实现的语义(向负无穷大舍入),这意味着签名类型除非无符号类型,否则可能需要更多指令(调整结果)。还有其他一些小怪癖。但无论如何,你在实践中都不会注意到它。

P.S。我不知道你为什么在你的问题中提到“类型转换”,而后面的代码示例中没有类型转换。