でコンパイルすると、GCC は、最適化のため-Wsuggest-attribute=pure
に でマークできる潜在的な関数を提案します。__attribute__ ((pure))
GCC のドキュメントでの定義は次のとおりです。pure
多くの関数は戻り値以外には影響を与えず、その戻り値はパラメーターやグローバル変数のみに依存します。このような関数は、算術演算子と同様に、一般的な部分式の削除とループの最適化の対象となります。これらの関数は属性 pure で宣言する必要があります。
メンバーinput_context
を含むクラスがある小さなゲームエンジンを作成しています。input_state
このinput_context
クラスinput_state
は、オペレーティング システムからグローバルな入力状態を取得することにより、フレームごとにメンバーを更新します。
また、入力状態を照会するための「ゲッター」もいくつか含まれています。
簡単な例:
class input_context
{
private:
input_state _input_state;
public:
void update()
{
os::fill_input_state(_input_state);
}
auto mouse_x() const noexcept
{
return _input_state._mouse_x;
}
auto mouse_y() const noexcept
{
return _input_state._mouse_y;
}
auto is_key_down(keycode k) const noexcept
{
// `_keys` is an array of `bool` values.
return _input_state._keys[k];
}
};
mouse_x()
GCC は、 、 、 などのこれらすべての「ゲッター メソッド」が の候補であるmouse_y()
と言っています。is_key_down()
__attribute__ ((pure))
これらのメソッドを としてマークする必要がありpure
ますか?
私はそうは思いませんが、GCC の提案を見て疑問に思いました。
GCC の定義を解釈する方法がわかりません。パラメーターやグローバル変数のみにpure
依存する関数はそのようにマークする必要があると書かれています。
ある意味では、グローバル OS 入力状態はグローバル変数として解釈できます。
一方、「getter メソッド」は、
_input_state
メンバー変数に応じて、常に異なる値を返します。