2011-11-28 82 views
7

下面是一些代碼,我寫的(使用GCC的__restrict__延伸到C++):* restrict/* __ restrict__如何在C/C++中工作?

#include <iostream> 

using namespace std; 

int main(void) { 
    int i = 7; 
    int *__restrict__ a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    cout << **&a << endl; // *a - which prints 9 in this case 

    return 0; 
} 

或者,C版(如果C++版本尚不清楚由於使用的擴展,它每一個流行的C++編譯器支持),使用GCC:

#include <stdio.h> 

int main(void) { 
    int i = 7; 
    int *restrict a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    printf("%d \n", **&a); // *a - which prints 9 in this case 

    return 0; 
} 

從我讀過,如果我這樣做*a = 5,它改變了他,a,所指向的內存值;在那之後,他指向的內存不應該被除a之外的其他人修改,這意味着這些程序是錯誤的,因爲bc之後對它進行了修改。 或者,即使b先修改了i,之後只有a才能訪問該內存(i)。 我是否正確地得到它?

P.S:限制在這個程序中不會改變任何東西。有或沒有限制,編譯器將產生相同的彙編代碼。我寫這個程序只是爲了澄清事情,它不是restrict用法的好例子。 restrict使用的一個很好的例子,你可以在這裏看到:http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

+5

在C++中沒有'restrict';其他任何東西都是編譯器擴展。 –

+1

[人類可以通過限定符限定符生成什麼?](http://stackoverflow.com/questions/1506794/what-c​​an-human-beings-make-out-of-the-restrict-qualifier) –

+0

@KerrekSB比在C中考慮這個程序,使用「restrict」,我問了C/C++ ......其中之一。 –

回答

11

聲明

*b = 8; 
*c = 9; 

會導致不確定的行爲。

從文檔:

指針是在存儲器中的位置的地址。多個指針可以訪問同一塊內存並在程序過程中對其進行修改。 restrict類型限定符指示編譯器,如果restrict限定指針的地址被修改,則其他指針將不會訪問相同的內存。編譯器可能會選擇優化涉及restrict限定指針的代碼,否則可能會導致錯誤行爲。程序員有責任確保使用restrict限定的指針,因爲它們是打算使用的。否則,可能會導致未定義的行爲。

+0

我不是寫同樣的東西嗎?我沒有問過程序是否正確,我說自己由於b和c是錯誤的。錯誤我不是說它會給出錯誤,甚至不是一個警告消息,因爲它是「程序員和編譯器之間的契約」,編譯器不檢查它。所以,我明白我的問題的答案(「我是否正確/正確?」)是一個簡單的「否」? –

+0

如果問題不明確:我沒有問過該程序是否正確,它的目的是錯誤的。我問是否解釋了我對代碼下「限制」的理解是正確的。 –

+3

@MoraruLilian「No」特別回答「或者,即使」b「先修改」i「,之後只有」a「可以訪問該內存(」我「),我是否正確地獲取它?關鍵是你甚至不允許通過另一個指針訪問這個變量。 – Beginner