gpt4 book ai didi

c - 人类可以从 restrict 限定词中得到什么?

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

如果我正确地使用了 C99 restrict 关键字,用它限定一个指针就是一个 promise ,它引用的数据不会通过别名在编译器的背后被修改。

相比之下,我对 const 限定符的理解是作为编译器强制文档,即给定对象不会在人类编写代码的背后进行修改。编译器可能会得到提示作为副作用,但作为程序员我并不关心。

以类似的方式,将函数原型(prototype)中的 restrict 限定符视为用户确保对通话时长?它应该用作“文档”吗?

此外,restrict 限定指针而不是它指向的数据(如 const 那样)这一事实是否有什么需要理解的?

编辑:我最初认为 restrict 可能会对线程代码产生影响,但这似乎是错误的,所以我从问题中删除了对线程的引用以避免混淆读者。

最佳答案

Chris Dodd 对关键字的描述是正确的。在某些平台中,出于性能原因,它可能非常重要,因为它让编译器知道一旦它通过该指针将数据加载到寄存器中,就不需要再次这样做。如果没有这种保证,编译器必须在每次写入任何其他可能存在别名的指针时通过指针重新加载数据,这会导致严重的管道停顿,称为 load-hit-store。 .

constrestrict 是不同的概念,并不是const 就意味着restrictconst 的意思是您不会在该函数的范围内通过该指针进行写入const 指针可能仍然是别名。例如考虑:

int foo( const int *a, int * b )
{
*b *= 2;
return *a + *b; // induces LHS: *a must be read back immediately
// after write has cleared the store queue
}

虽然您不能在此函数中直接写入 a,但您可以像这样调用 foo 是完全合法的:

int x = 3;
foo( &x, &x ); // returns 12

restrict 是一种不同的保证:在对 foo() 的所有调用中 promise a != b

我已经 written about the restrict keyword and its performance implications at length , 和 so has Mike Acton .尽管我们讨论的是特定的有序 PowerPC,但 x86 上也存在加载命中存储问题,但 x86 的无序执行使得该停顿更难在配置文件中隔离。

只是强调一下:如果您完全关心性能,这不是神秘的或过早的优化。如果使用得当,restrict 可以带来真正显着的加速。

关于c - 人类可以从 restrict 限定词中得到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506794/

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