按值传递字符串vs按值传递每个字符

时间:2016-08-23 17:15:41

标签: c++

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?是不是有效地复制了相同数量的字符?或者他们实际上是一样的,我错过了什么?

3 个答案:

答案 0 :(得分:1)

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

通过const引用传递std::string

void func(const std::string&);

答案 1 :(得分:1)

将一个字符串的每个字符按值传递给一个函数就像通过值传递整个字符串一样不合适。也就是说,在这两种情况下,你都应该选择一些替代方案,如果可以的话,整个字符串都不必复制或遍历。

答案 2 :(得分:1)

按值传递单个字符是正常的,因为字符的大小小于需要通过引用传递的指针的大小。另外,没有为角色调用复制构造函数。

(这并不意味着为字符串中的每个字符调用函数总是正常的)