2011-11-28 83 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