2012-11-16 53 views
0

比方說,我有個字符的緩衝,我想避免使用的memcpy,並通過一個int *變量訪問它:__restrict是否允許忽略嚴格的別名規則?

char buffer[100]; 
strcpy(buffer,"Hello"); 
int* __restrict ptr=(int*)buffer; 
*ptr= 97; 
printf("%s",buffer); 

當然打印「一個」現在這個。
我可以做到這一點,而不會遇到未定義的行爲?

+2

我想你會走錯方向。如果有的話,'restrict'將會使編譯器*更有可能「破壞」某些東西,因爲它假定沒有別名。 – Mysticial

+4

確實。 'restrict'使混疊規則更嚴格;除了使用「基於」的指針(基於「基於」的概念的聰明定義)之外,你不允許別名指針**。甚至沒有指向相同類型或「char」類型指針的指針。當然,其他類型的指針也不允許別名。 –

+0

那麼我還需要使用工會嗎? –

回答

1

現在這當然打印「a」。

那麼,只有在小端機器上。

及嚴格別名就什麼都沒有做你的榜樣的類型之一,是charchar可引用任何東西如果restrict的目的不是爲了增加箱子數編譯器在哪裏可以假設有沒有別名,即使輸入信息不會阻止它。

很明顯,如果您想要關於實現域中的__restrict的信息,您應該指定實現。