繁体   English   中英

C ++中的CPU使用率较少:是否声明为unsigned int?

[英]Less CPU usage in C++: declaring as unsigned int or not?

需要最多的CPU:

int foo = 3;

或将其类型转换为unsigned int?

unsigned int foo = 3;

它们都由内存中的相同位表示。 这只是位的解释方式的问题,具体取决于所需值的范围。 因此,两者都不是更密集的。

至于使用数字的例子,以乘法为例:我不是专家,但是根据Wikipedia的说法,在x86中,存在针对无符号乘法( mul )和有符号乘法( imul )的操作码,这意味着它们的长度可能相同时间。

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

; 9    :    int foo = 3;

    mov DWORD PTR _foo$[ebp], 3

; 10   :    unsigned int bar = 3;

    mov DWORD PTR _bar$[ebp], 3

没有不同 :)

CPU使用率没有差异。

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

唯一的区别是编译器将记住该变量是带signed还是unsigned ,并决定如何实现比较之类的操作或确定要调用的重载函数。

我立即想到的是:它不是将int转换为unsigned int。 因此,速度没有差异。 是有关快速类型的链接。 但是,应该优化的算法和功能而不是类型。

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

当你做除法。 使用unsigned intint快。 (当然,当实际上不需要减号时。)

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

原则上,声明一个没有指定符号性的纯int应该让编译器知道,就大小和符号性而言,可以自由选择最自然的整数。 但是,实际上,现代台式机处理器(尽管可能在某些嵌入式系统上)没有速度差异。

您通常不会在实践中注意到任何区别,因此,我认为最佳实践是根据应表示的值的特定于应用程序的语义来选择类型:使用无符号类型表示无符号数量; 签名也一样。 尽管有些人反对这种哲学,并且倾向于在可能的地方使用int并且仅在需要时才使用unsigned int

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM