Gibt es eine Möglichkeit zu deklarieren, dass eine Variable nicht-Aliasing in clang
ist, um mehr Optimierungen zu ermöglichen, wo die Variable verwendet wird?Deklarieren einer Variable ohne Aliasing in Clang?
Ich verstehe restrict
kann verwendet werden, um Zeiger als Non-Aliasing zu deklarieren.
Allerdings frage ich mich auch über Variablen, die Zeiger sein können. Ich vermute (vielleicht zu Unrecht), dass der Compiler vorsichtig sein muss, Dinge anzunehmen, die es ihm erlauben, den Wert einer Variablen zwischenzuspeichern, anstatt ihn jedes Mal neu zu laden.
Beispiel:
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;
};
Auch wenn die Antwort auf die Frage in dem Beispielcode „Ja“ ist, kann es nicht auf „Nein“ ändern, wenn der Code war komplizierter (zB Arbeit unter // Do more work
ist) , aufgrund einer Möglichkeit, dass ein Zeigerinhalt geändert wird, wo der Zeiger auf m_data.m_val
gezeigt haben könnte? Oder ist das etwas, von dem der Compiler annimmt, dass es nie passiert, außer es sieht die Adresse m_val
irgendwo im Code?
Wenn es nicht davon ausgehen, dass, oder sogar es tut, aber die Adresse der m_val
tut irgendwo zu bekommen genommen (aber wir wissen, dass sein Inhalt nicht geändert werden), dann wäre es schön, die Lage sein, um m_val
als "sicher" von Aliasing-Belangen zu markieren, kann angenommen werden, dass sein Wert nicht durch Zeigerzugriff geändert wird.
Suchen Sie nach [restrict] (http://stackoverflow.com/questions/776283/what-does-the-restrict-keyword-mean-in-c)? – Jarod42
Ja, danke. Ich frage mich aber auch über Nicht-Zeiger-Variablen; wird mehr Details geben. – Danra
Weitere Details hinzugefügt. – Danra