2

次のトピックに出くわしたとき、「C++ の読み取り専用パブリック クラス メンバー」についてグーグルで調べていましたpublic const references to private members

class Planet
{
private:
    int64_t mass_;
public:
    Planet(int64_t mass);

    const int64_t & Mass = mass_;    // I'm using C++11
};

私はこの概念がインラインの const ゲッター関数よりも好きでした。これは、構文糖分のためです。myPlanet.Massかなり冗長に見えるmyPlanet.GetMass(). ただし、これには参照変数が 1 つ増えるため、メモリが犠牲になることがわかりました。私が理解できないのは、コンパイラがこの参照によって使用されるスペースを最適化しない理由です。これが指すオブジェクトは決して変更されず、指すオブジェクトはコンパイル時に認識されるためです (新しい c++11 構文のおかげです)。gcc でさまざまな最適化設定を試しましたが、役に立ちませんでした。

だから私は2つの疑問があります:

  1. コンパイラが参照を最適化しない理由はありますか?
  2. コンパイラにこの最適化を強制する方法はありますか? たぶん、非標準__attribute__または新しいC++ 11などを使用し[[attribute]]ていますか?

どんな助けでも大歓迎です:)

4

1 に答える 1

0

コンパイラーは、作成者が行う最適化のみを行います

  1. と考えてきた
  2. それらを実装するための努力に値するという点で、実用的に有用であると考えられています。

あなたのアプローチは、おそらく1ではなく、間違いなく2ではないほど珍しいものです。ゲッターは単純に柔軟性があり、スペースコストがなく、クラスで直接定義されている場合、すべてのC ++コンパイラがインライン化できます(場合によっては、共有ライブラリのABI互換性を維持したいが、完全に制御できる場合のように)。

于 2013-02-07T08:42:39.580 に答える