gpt4 book ai didi

c - const 限定指针的 restrict 是多余的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:31:15 26 4
gpt4 key购买 nike

如果我们将 f 和 g 定义为:

void f(const int *restrict a, const int *restrict b, int *c){ ... }
void g(const int * a, const int * b, int *c){ ... }
  1. 假设 f 和 g 具有等效的主体,从调用者的角度来看它们是否相同?
  2. 在callee中,我们是否可以对参数做同样的假设?
  3. 编译器有同样的优化机会吗?

如果 restrict 是多余的,我希望所有三个答案都是肯定的。
否则,为什么不呢?

不要考虑不良的编程实践,例如丢弃 const 限定符。

最佳答案

对于这种情况:

void f(const int *restrict a, const int *restrict b, int *c)

restrict 不是多余的。这意味着编译器可以假设 ac 没有别名。例如,如果函数体是:

int d = *a;
*c = 5;
d = *a;

然后编译器可以删除第三行。


C11 6.7.3/7 涵盖了这一点:

This association, defined in 6.7.3.1 below, requires that all accesses to that object use, directly or indirectly, the value of that particular pointer.

也就是说,如果通过a 访问对象,则不允许通过bc 访问该对象.

正式定义见C11 6.7.3.1/4(Restrict的正式定义):

If L is used to access the value of the object X that it designates, and X is also modified (by any means), then the following requirements apply: T shall not be const-qualified

这里的Ta指向的声明类型,即const intL*aXac 指向的任何 int

关于c - const 限定指针的 restrict 是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39906149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com