下面是我写的一些代码(使用GCC对C++的__restrict__扩展):
#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以外的任何人修改,这意味着这些程序是错误的,因为b和c在那之后修改了它。或者,即使b首先修改了i,之后应该只有a可以访问该内存(i)。我的理解正确吗?
附言:此程序中的限制不会改变任何事情。不管有没有restrict,编译器都会生成相同的汇编代码。我写这个程序只是为了澄清一些事情,它不是一个很好的restrict用法的例子。您可以在此处看到一个很好的restrict用法示例:http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
发布于 2011-11-28 09:44:57
不是的。
语句
*b = 8;
*c = 9;将导致未定义的行为。
来自文档:
指针是内存中某个位置的地址。在程序执行过程中,多个指针可以访问相同的内存块并对其进行修改。
restrict类型限定符指示编译器,如果由restrict-qualified指针寻址的内存被修改,则不会有其他指针访问该内存。编译器可能会选择优化涉及restrict-qualified指针的代码,否则可能会导致不正确的行为。程序员有责任确保restrict-qualified指针按预期使用。否则,可能会导致未定义的行为。
https://stackoverflow.com/questions/8290666
复制相似问题