1
我正在使用mingw32-gcc和C99標準。我通過關於restrict
關鍵字http://wr.informatik.uni-hamburg.de/_media/teaching/wintersemester_2013_2014/epc-1314-fasselt-c-keywords-report.pdf的文章進行了一些編輯,從而在代碼下面粘貼了代碼。根據作者,"Result One"
和"Result Two"
應該是不同的,但是當我運行它時,它們是相同的。我沒有收到任何編譯器警告。有沒有我錯過的設置?restrict-Keyword無法正常工作?
#include <stdio.h>
void update(int* a, int* b, int* c)
{
*a += *c;
*b += *c;
}
void update_restrict(int* a, int* b, int* restrict c)
{
printf("*c = %d\n",*c);
*a += *c;
printf("\n*c = %d - ",*c);
printf("shouldn't this have stayed the same?\n\n");
*b += *c;
}
int main()
{
int a = 1, b = 2;
update(&a, &b, &a);
printf("Result One: a, b = %d, %d\n", a, b);
a = 1; b = 2; // reset values
update_restrict(&a, &b, &a);
printf("Result Two: a, b = %d, %d\n", a, b);
getchar();
return 0;
}
'restrict'不必影響你的輸出。只有編譯器才能進行可能的優化。結果可能相同,並可能不同。 – cshu
我認爲'update_restrict'中的* c值會在* a發生變化後保持不變,因爲它只會被加載一次。我不明白這是如何影響結果的。 –
你沒有說你是如何編譯的(編譯器版本,命令行標誌等)。 Gcc對restrict的含義有一個弱解釋:標記單個變量restrict對於gcc來說本質上是無用的,它只假設**兩個** restrict的兩個變量不是別名。另外,編譯器可以很好地內聯函數,這可能會使問題消失。在update_restrict上使用__attribute __((noinline,noclone))來避免這種情況。 –