2016-08-23 120 views
0
void func(char c) {} 
void func(std::string) {} 

int main() { 
    std::string s("HelloWorld"); 

    // method 1 
    func(s); 

    // method 2 
    for(std::size_t i = 0; i < s.size(); i++) { 
     func(s[i]); 
    } 
} 

为什么在第二次调用OK时传递值?是不是最终有效地复制相同数量的字符?或者他们实际上是一样的,我错过了什么?按值传递字符串vs按值传递每个字符

+1

什么是实际代码的目的编写的youre并有一个问题?该函数是否应该一次只处理一个字符,或者处理整个字符串? –

+2

您还应该计算两种情况下的函数调用次数。如果你想知道什么是最快的,也做一些测量。当然,不要忘记传递参考。 –

回答

1

std::string的副本将执行分配(除非小字符串优化),而传递char作为参数可能会通过寄存器完成。

std::string通过const引用

void func(const std::string&); 
+0

并非所有系统都有足够的寄存器传递值的寄存器。例如,像32位x86架构一样。但这不是最大的交易,最大的交易是正在进行的*函数调用的数量。有很大的区别。 –

+0

我的问题是你必须复制任何值至少两次。例如,如果您将一个char分配给一个char数组中的单元格,那么您需要使用赋值运算符,我假设这个赋值运算符将通过值取char,然后再将此值复制到所需的单元格中。 – mkmostafa

+0

@mkmostafa你的*实际*问题是什么?它是“效率”还是优化?复制一个角色是微不足道的,只有在短时间内完成数百万次时才会引起注意。我认为你需要阅读[XY问题](http://xyproblem.info/)并考虑它与你的问题的关系。 –

1

按值传递一个字符串的每个字符的功能是一样没有,没关系,按值传递整个字符串。也就是说,在这两种情况下,如果可以的话,您应该更喜欢一些替代方案,即整个字符串不必复制或遍历。

1

按值传递单个字符是可以的,因为字符的大小小于需要通过引用传递的指针的大小。另外,不会为字符调用复制构造函数。

(这并不意味着调用函数在一个字符串的每个字符总是OK)