gpt4 book ai didi

c++ - 现代 C++ 编译器是否优化了对类的同一数据成员的重复访问?

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:14 24 4
gpt4 key购买 nike

考虑:

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 的参数。没有定义,答案是肯定的。因此编译器必须在调用 do_stuff

后重新加载 b.my_A_member()

为了可读性,我无论如何都会这样做:

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/

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