gpt4 book ai didi

c++ - f(const string &) 和 f(const string ) 之间有什么区别吗?

转载 作者:可可西里 更新时间:2023-11-01 18:40:21 25 4
gpt4 key购买 nike

class mystring {
friend ostream& operator<<(ostream &out, const mystring ss) {
out << ss.s;
return out;
}
private:
string s;
public:
mystring(const char ss[]) {
cout << "constructing mystring : " << ss << endl;
s = ss;
}
};

void outputStringByRef(const mystring &ss) {
cout << "outputString(const string& ) " << ss << endl;
}

void outputStringByVal(const mystring ss) {
cout << "outputString(const string ) " << ss << endl;
}

int main(void) {
outputStringByRef("string by reference");
outputStringByVal("string by value");
outputStringByRef(mystring("string by reference explict call mystring consructor"));
outputStringByVal(mystring("string by value explict call mystring constructor"));
} ///:~

考虑到上面的例子,我们不能修改传引用变量,也不能修改传值变量。每种方法的输出都是一样的。因为这两种方法没有区别,为什么 C++ 支持这两种方法?

谢谢。

最佳答案

两者是有区别的。请考虑以下事项:

#include <iostream>
#include <string>
using std::string;

string g_value;

void callback() {
g_value = "blue";
}

void ProcessStringByRef(const string &s) {
callback();
std::cout << s << "\n";
}

void ProcessStringByValue(const string s) {
callback();
std::cout << s << "\n";
}

int main() {
g_value = "red";
ProcessStringByValue(g_value);
g_value = "red";
ProcessStringByRef(g_value);
}

输出:

red
blue

仅仅因为引用在函数内部是 const,并不意味着不能通过其他引用来修改引用对象(一个对象具有多个引用或指向它的指针的情况称为“别名化”)。因此,传递 const 引用和传递 const 值之间存在差异 - 在引用的情况下,对象可能会在调用后发生变化。在值的情况下,被调用者有一个私有(private)拷贝,不会改变。

由于它们做不同的事情,C++ 允许您选择您想要的。

无论哪种方式都会对性能产生影响 - 当您按值传递时,必须制作一个拷贝,这会产生成本。但是编译器然后知道只有你的函数可能有对该拷贝的任何引用,这可能允许其他优化。在 callback() 返回之前,ProcessStringByRef 无法加载要打印的字符串内容。 ProcessStringByValue 可以,如果编译器认为这样做更快的话。

通常你关心的是拷贝,而不是指令的执行顺序,因为通常拷贝的成本要高得多。因此,通常情况下,您会尽可能通过引用传递那些不易复制的对象。但是混叠的可能性有时会对性能产生非常严重的影响,即使实际上没有发生混叠,也会阻止某些优化。这就是存在“严格的别名规则”以及 C99 中的 restrict 关键字的原因。

关于c++ - f(const string &) 和 f(const string ) 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1961028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com