void g();
int f(const int &x) {
int y = x;
g();
return x + y;
}
这里,x
中的值必须在g()
之前和之后加载两次,因为g
允许修改x
引用的值。
你可以通过显式加载来避免这个问题。
int f(const int &rx) {
int x = rx;
int y = x;
g();
return x + y;
}
但是c++已经发展成这样一种方式:你不需要写下这些细节,并且仍然有高性能的代码。
有没有办法告诉编译器在x
的声明,被引用的值将不会改变外部函数调用?
没有办法将函数标记为不修改x
,并且从所显示的代码中也不清楚情况是否如此。考虑这个来源:
void g();
int f(const int &x) {
int y = x;
g();
return x + y;
}
int t;
void g() { ++t; }
int main() {
f(t);
}
除非编译器看到g
的定义,并且可以看到x
不能被它修改,否则没有办法避免两次加载。许多编译器甚至不会尝试,除非g
是内联的。
注意:gcc/clang有属性pure来标记没有副作用的函数:
[[gnu::pure]] void g();
但是一个纯函数返回void
意味着它永远不会被调用。没有副作用的空函数是没有意义的。