现代C++编译器是否优化了对类中同一数据成员的重复访问?
Do modern C++ compilers optimize away repeated accesses to the same data member of a class?
考虑:
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();
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 使公共数据成员在C++中无法访问
- 有没有办法在C++中循环访问对象的不同数据成员
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 如何在C++中使用类对象访问指针数据成员
- 通过指针算法访问结构数据成员
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 如何在 c++ 中访问类的私有数据成员
- 现代C++编译器是否优化了对类中同一数据成员的重复访问?
- 无法访问派生类函数内的基类的受保护数据成员
- 从私有结构数据成员访问类公共成员函数C++
- 有关C++/组件数据布局、数据成员访问、方法的一般问题
- C++ 共享库不允许静态数据成员访问
- 私人数据成员访问
- OpenCV Mat数据成员访问
- 数据成员访问歧义和菱形继承