簡體   English   中英

現代 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的參數。 沒有定義,答案是肯定的。 所以編譯器必須在調用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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM