是否有可能告诉编译器,由指针/引用引用的值不修改函数调用?


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意味着它永远不会被调用。没有副作用的空函数是没有意义的。

最新更新