[英]Will GNU GCC keep track of objects which have previously been dereferenced using the arrow operator?
使用以下結構,
struct A
{
A(int d1, int d2)
{
data1 = d1;
data2 = d2;
}
int data1, data2;
};
下面函數中的最后一行會再次取消引用指針,還是編譯器會知道使用以前取消引用的對象?
int main()
{
A* a = new A(1, 2);
//dereference a
cout << a->data1 << endl;
//dereference a again?
cout << a->data2 << endl;
}
如果沒有,是否有任何編譯器可以做到這一點?
我知道我可以進行實驗來測試我的問題,但是我不太了解匯編語言。
是的,在這種情況下,生成的代碼可能不會真正執行另一個取消引用。 當編譯器可以確定兩個語句之間的a
不會改變時,就會發生這種情況。
這是一種常見的優化類別,並且是當人們違反嚴格的別名規則時導致許多錯誤的原因(因為這可能會破壞編譯器檢測a
未更改的能力)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.