首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*restrict / *__restrict__在C/ C++中是如何工作的?

*restrict / *__restrict__在C/ C++中是如何工作的?
EN

Stack Overflow用户
提问于 2011-11-28 09:40:01
回答 1查看 7.8K关注 0票数 8

下面是我写的一些代码(使用GCC对C++的__restrict__扩展):

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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)。我的理解正确吗?

附言:此程序中的限制不会改变任何事情。不管有没有restrict,编译器都会生成相同的汇编代码。我写这个程序只是为了澄清一些事情,它不是一个很好的restrict用法的例子。您可以在此处看到一个很好的restrict用法示例:http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-28 09:44:57

不是的。

语句

代码语言:javascript
复制
*b = 8;
*c = 9;

将导致未定义的行为。

来自文档:

指针是内存中某个位置的地址。在程序执行过程中,多个指针可以访问相同的内存块并对其进行修改。restrict类型限定符指示编译器,如果由restrict-qualified指针寻址的内存被修改,则不会有其他指针访问该内存。编译器可能会选择优化涉及restrict-qualified指针的代码,否则可能会导致不正确的行为。程序员有责任确保restrict-qualified指针按预期使用。否则,可能会导致未定义的行为。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8290666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档