考虑:

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/

10-11 23:16
查看更多