考虑:
class A
{
public:
const int& my_int_member() const { return my_int_member; }
const double& my_double_member const {return my_double_member; }
private:
int my_int_member;
double my_double_member;
};
class B
{
public:
const A& my_A_member() const { return my_A_member; }
private:
A my_A_member;
};
做现代的c++编译器(例如msvc,clang,gcc),并设置每个提供的最大优化级别,通常可以识别并优化对同一数据成员的重复访问,如下所示:
B b;
do_stuff(b.my_A_member().my_double_member(), b.my_A_member().my_int_member());
double c = b.my_A_member().my_double_member() + b.my_A_member().my_int_member();
也就是说,他们是否意识到他们可以重用相同的引用,还是只是再次进行访问?
最佳答案
如果定义是可见的,并且如果编译器可以证明它执行了相同的操作(使用as-if规则进行优化)(使用别名,全局访问等,我们可以进行操作则比较棘手,那么它可以做到) (并且可能会这样做)。
但是,假设我们将您的示例修改为(b不再是本地的,而是作为参数给出):
void foo(B& b)
{
do_stuff(b.my_A_member().my_double_member(), b.my_A_member().my_int_member());
double c = b.my_A_member().my_double_member() + b.my_A_member().my_int_member();
}
do_stuff
可以修改全局B
吗,它将作为foo
的参数。没有定义,答案是肯定的。
因此,编译器必须在调用
b.my_A_member()
之后重新加载do_stuff
为了提高可读性,我还是会这样做:
B b;
const auto& a = b.my_A_member();
do_stuff(a.my_double_member(), a.my_int_member());
double c = a.my_double_member() + a.my_int_member();
关于c++ - 现代C++编译器是否优化了对类的同一数据成员的重复访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57673661/