按值传递字符串vs按值传递每个字符
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按值传递每个字符
std::string
的副本将执行分配(除非小字符串优化),而传递char
作为参数可能会通过寄存器完成。
通std::string
通过const引用
void func(const std::string&);
并非所有系统都有足够的寄存器传递值的寄存器。例如,像32位x86架构一样。但这不是最大的交易,最大的交易是正在进行的*函数调用的数量。有很大的区别。 –
我的问题是你必须复制任何值至少两次。例如,如果您将一个char分配给一个char数组中的单元格,那么您需要使用赋值运算符,我假设这个赋值运算符将通过值取char,然后再将此值复制到所需的单元格中。 – mkmostafa
@mkmostafa你的*实际*问题是什么?它是“效率”还是优化?复制一个角色是微不足道的,只有在短时间内完成数百万次时才会引起注意。我认为你需要阅读[XY问题](http://xyproblem.info/)并考虑它与你的问题的关系。 –
按值传递一个字符串的每个字符的功能是一样没有,没关系,按值传递整个字符串。也就是说,在这两种情况下,如果可以的话,您应该更喜欢一些替代方案,即整个字符串不必复制或遍历。
按值传递单个字符是可以的,因为字符的大小小于需要通过引用传递的指针的大小。另外,不会为字符调用复制构造函数。
(这并不意味着调用函数在一个字符串的每个字符总是OK)
什么是实际代码的目的编写的youre并有一个问题?该函数是否应该一次只处理一个字符,或者处理整个字符串? –
您还应该计算两种情况下的函数调用次数。如果你想知道什么是最快的,也做一些测量。当然,不要忘记传递参考。 –