C++ 隐式强制转换函数的返回对象是否会影响性能?

C++ 隐式强制转换函数的返回对象是否会影响性能?,c++,C++,我希望在这里澄清一些困惑。这看起来很简单,但我找不到明确的答案 我是否应该始终使用函数的显式返回类型,除非我有充分的理由不使用(例如,需要保存内存),即使我知道可以返回的范围适合较小的类型 以以下函数为例: size_t std::string::find_last_of (char c, size_t pos = npos) const; 这是: std::string s("woof.woof.meo.w"); size_t result = s.find_last_of('.'); 比

我希望在这里澄清一些困惑。这看起来很简单,但我找不到明确的答案

我是否应该始终使用函数的显式返回类型,除非我有充分的理由不使用(例如,需要保存内存),即使我知道可以返回的范围适合较小的类型

以以下函数为例:

size_t std::string::find_last_of (char c, size_t pos = npos) const;
这是:

std::string s("woof.woof.meo.w");
size_t result = s.find_last_of('.');
比这个效率低、同等或更高:

std::string s("woof.woof.meo.w");
unsigned char result = s.find_last_of('.');
我认为无论结果复制到什么类型,最初都会构造一个大小。因此,当隐式转换为较小的类型时,没有性能增益。但是有没有表演热播?较大类型的冗余位会发生什么情况


谢谢您的时间,我感谢您的指导。

我不会直接回答您的问题

正确性比性能更重要。在您的示例中,使用
无符号字符
不会使代码不正确,但它引入了一个隐含的假设:生成的位置足够小,可以容纳
无符号字符
。如果将这一点发挥到极致,你可以写:

std::string s("woof.woof.meo.w");
const unsigned char result = 13;
为了让人明白这一点,我在夸大其词。如果可能,第二行应该是正确的,与之前发生的情况无关。
size\u t
足够大,可以容纳字符串的任何大小。对于
无符号字符
,情况并非如此。使用
unsigned char
意味着您将静音或忽略因强制转换为较小类型而产生的警告,因此,一旦字符串足够长,导致代码失败,您也将错过警告


结论:使用正确型号的安全性肯定超过了性能上的微小差异(如果存在的话)(实际上没有)。

不要进行微优化!这种努力毫无意义,只会造成伤害。请记住,在
C
C++
中有“仿佛规则”,所以编译器可以为您优化很多东西,您不必编写一些奇怪的装置。保持代码简单,并考虑算法复杂性。使用
auto
。我要强调的是,任何可能的性能缺陷都是非常微小的。这种转换将花费您不超过一个周期的一小部分(通常它将完全不花费任何费用)。您的程序必须运行数十亿次,才能使您花在考虑性能差异上的时间减少。除非您的分析结果强烈表明这一行存在瓶颈,否则优化它完全是浪费时间。这就撇开了正确性问题(在回答中提到)。@MaxLanghof:不过,人们必须小心。虽然您确实可以非常轻松地访问寄存器的低字节,而且看起来是免费的,但当它是一种优势时,以及当它实际上是免费的时,这一点并不明显。例如,您可能会遇到错误的依赖关系,或者存储转发的相当复杂的规则,等等。哦,令人高兴的是,规则不仅在制造商之间不同,甚至在子模型之间也不同。@Damon所有的要点都很重要,但这只会进一步强调,在没有解决具体性能问题的情况下讨论这种优化太过广泛/浪费时间。在大多数情况下,这是编译器需要解决的问题,对于这样的事情来说,这并不重要(除非您实际分析了代码并发现这是一个真正的性能瓶颈(我对此表示怀疑))。我只想使用
const auto result=…
,然后继续讨论更重要的问题。你可以在零时间内得到错误的答案。