clang
に変数を宣言して、変数を使用する場所をさらに最適化できるようにする方法はありますか?clangで変数を宣言していますか?
restrict
は、ポインタを非エイリアシングとして宣言するために使用できます。
しかし、私はポインタになる可能性のある変数についても疑問に思います。私は(おそらく間違って)、コンパイラは毎回それを再フェッチするのではなく、変数の値をキャッシュできるようにすることに注意しなければならないと思います。
例:サンプルコードでの質問への答えが「イエス」である
class Data
{
public:
void updateVal() {
// Updates m_val with some value each time it's called (value may differ across different calls)
...
}
int complicatedCalculation() const {
return 3 * m_val + 2;
}
int m_val;
};
class User
{
User(Data& data) : m_data{data} {}
void f()
{
m_data.updateVal();
for (int i=0; i<1000; ++i)
g();
}
void g()
{
// Will the optimizer be able to cache calc's value for use in all the calls to g() from f()?
int calc = m_data.complicatedCalculation();
// Do more work
...
}
Data& m_data;
};
場合でも、コードが複雑であれば、それは「ノー」に(// Do more work
下にあるなどの作業)を変更しない場合がありますポインターがm_data.m_val
を指していた可能性があるため、ポインターの内容が変更される可能性があるためです。または、コードのどこかでm_val
のアドレスが取られていないと見なさない限り、コンパイラは何も起こらないと想定していますか?
それははがいることを前提としていない、あるいはそれがなく、m_val
のアドレスがどこかに取ら取得んん(私たちは、その内容が変更されることはありません知っている)、できるようにするにはいいだろう場合m_val
をエイリアシングの懸念から「安全」とマークするため、その値はポインタアクセスによって変更されないものと想定できます。
[制限](http://stackoverflow.com/questions/776283/what-does-the-restrict-keyword-mean-in-c)をお探しですか? – Jarod42
はい、ありがとうございます。しかし、私はポインタ以外の変数についても疑問を抱いています。より詳細な情報を提供します。 – Danra
詳細を追加しました。 – Danra