C++中CPU使用率降低:是否声明为无符号int?

C++中CPU使用率降低:是否声明为无符号int?,c++,c,optimization,C++,C,Optimization,什么需要最多的CPU: int foo = 3; 还是将其转换为无符号整数 unsigned int foo = 3; 它们都由内存中相同的位表示。这只是一个如何解释位的问题,这取决于您想要的值的范围。因此,两者都不是更密集的 关于处理数字,以乘法为例:我不是专家,但根据,在x86中,无符号乘法mul和有符号乘法imul有操作码,这意味着它们可能需要相同的时间长度。它们都由内存中相同的位表示。这只是一个如何解释位的问题,这取决于您想要的值的范围。因此,两者都不是更密集的 关于数字的处理,以乘

什么需要最多的CPU:

int foo = 3;
还是将其转换为无符号整数

unsigned int foo = 3;

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


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

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

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

CPU使用率没有差异

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

唯一的区别是编译器将记住变量是有符号的还是无符号的,并决定如何实现诸如比较之类的操作或决定调用哪些重载函数。

CPU使用率没有区别

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


唯一的区别是编译器将记住变量是有符号的还是无符号的,并决定如何实现诸如比较之类的操作,或决定调用哪些重载函数。

在本例中,没有任何成本差异

在本例中,根本没有成本差异

我的直接想法是:它不是将整数转换成无符号整数。因此速度没有差别。是关于快速类型的链接。然而,应该优化的更多是算法和函数,而不是类型。

我的直接想法是:它不是将整数转换为无符号整数。因此速度没有差别。是关于快速类型的链接。然而,应该优化的更多是算法和功能,而不是类型。

这是在MS VC 2005中生成的汇编:

; 9    :    int foo = 3;

    mov DWORD PTR _foo$[ebp], 3

; 10   :    unsigned int bar = 3;

    mov DWORD PTR _bar$[ebp], 3

没有区别:

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

; 9    :    int foo = 3;

    mov DWORD PTR _foo$[ebp], 3

; 10   :    unsigned int bar = 3;

    mov DWORD PTR _bar$[ebp], 3

无差异:

无差异。您可以通过查看生成的汇编语言来判断。即使存在差异,您也应该意识到这是微观优化,正确的思考时间是在完成所有宏优化之后,这是您的工作,而不是编译器的工作。

没有差异。您可以通过查看生成的汇编语言来判断。即使存在差异,你也应该意识到这是微观优化,正确的思考时间是在所有宏观优化完成之后,这是你的工作,不是编译器的。

声明纯整数而不指定有符号性原则上应该让编译器知道,它可以根据大小和有符号性自由选择最自然的整数类型。然而,在实践中,现代桌面处理器没有速度差异,尽管可能在某些嵌入式系统上。

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

。 使用无符号int比int快。 当然,实际上不需要减号。

进行除法时。 使用无符号int比int快。
当然,实际上不需要减号。

在实践中,您通常不会注意到任何差异,因此在我看来,最佳实践是根据它应该表示的值的应用程序特定语义来选择类型:使用无符号类型来表示无符号量;签名的也一样。尽管有人反对这一理念,他们喜欢在任何可能的地方使用int,只有在必要的时候才使用unsigned int

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

另外,我不知道你为什么在报纸上提到打字
您的问题,而下面的代码示例中没有类型转换。

您通常不会注意到实践中的任何差异,因此在我看来,最佳实践是根据它应该表示的值的应用程序特定语义来选择类型:使用无符号类型来表示无符号量;签名的也一样。尽管有人反对这一理念,他们喜欢在任何可能的地方使用int,只有在必要的时候才使用unsigned int

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


另外,我不知道为什么您在问题中提到了类型转换,而下面的代码示例中没有类型转换。

只需进行数百万次的分析-类型转换是发生在演员身上的事情——它有一个SO标记,但可能不应该有区别,这将是编译器和处理器依赖性的——只需进行数百万次的分析-类型转换是发生在演员身上的事情-它有一个SO标记,但可能不应该有区别,如果有区别,它将依赖于编译器和处理器。你说的很容易理解,所以我把这个作为我接受的答案。@Midas:如果你不能理解其他答案,也许你不应该像这样关注微观优化,是的,你说的很容易理解,所以我把这个作为我接受的答案。@Midas:如果你不能理解其他答案,也许你不应该像这样关注微观优化