gpt4 book ai didi

c - `restrict` 会影响传递的指针的别名吗?

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

添加到 C99 中的 restrict 关键字的主要用途之一是允许编译器将某些内容加载到寄存器中,并假定该寄存器将反射(reflect)如此加载的变量的状态。给定

void foo1(int * restrict a, int * restrict b) {
(*a)++; (*b)++; (*b)+=(*a);
}

编译器有权假定对(*b) 的写入不会影响(*a),从而避免重新加载( *a) 之后。 restrict 是否对别名有任何其他影响?例如,给定:

extern void foo2a(int * restrict q);
extern void foo2b(void);
int x;
int foo2(restrict int *q) {
int z=x;
x++; *q++; x++;
foo2a(&z);
x++; *q++; z++;
foo2b();
x++; *q++; z++;
return x+(*q)+z;
}

编译器是否需要预测 *q 的增量,以及对 foo2a()foo2b() 的调用可能都打扰了x,调用可能对x*q的值“感兴趣”?编译器是否需要假定对 foo2a() 的调用可能会保留其参数——即使它被标记为 restrict,这样 foo2b() 可以修改 z 吗?

如果编译器需要在最坏情况假设下运行,尽管有 restrict 关键字,是否有任何方法允许编译器忽略任何正常义务来存储对某些变量的任何更改在函数调用之前并在下次需要时重新加载它?

最佳答案

仅回答标题中的问题:是的。 restrict 限定指针意味着您保证只能通过该指针单独访问所讨论的整个对象。这也意味着它不能使用相同类型的文件范围对象作为别名,例如

对于问题的其余部分,您正在混合使用。 restrict 绝不是调用者的保证。调用者甚至没有“看到”restrict 关键字,类型限定不是接口(interface)的一部分。因此,从调用返回时文件范围变量是否已更改与 restrict 无关。

restrict 只是调用者向被调用者提供的保证,被调用者随后可以在内部使用该信息进行优化。

关于c - `restrict` 会影响传递的指针的别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928042/

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