- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我正确地使用了 C99 restrict
关键字,用它限定一个指针就是一个 promise ,它引用的数据不会通过别名在编译器的背后被修改。
相比之下,我对 const
限定符的理解是作为编译器强制文档,即给定对象不会在人类编写代码的背后进行修改。编译器可能会得到提示作为副作用,但作为程序员我并不关心。
以类似的方式,将函数原型(prototype)中的 restrict
限定符视为用户确保对通话时长?它应该用作“文档”吗?
此外,restrict
限定指针而不是它指向的数据(如 const
那样)这一事实是否有什么需要理解的?
编辑:我最初认为 restrict
可能会对线程代码产生影响,但这似乎是错误的,所以我从问题中删除了对线程的引用以避免混淆读者。
最佳答案
Chris Dodd 对关键字的描述是正确的。在某些平台中,出于性能原因,它可能非常重要,因为它让编译器知道一旦它通过该指针将数据加载到寄存器中,就不需要再次这样做。如果没有这种保证,编译器必须在每次写入任何其他可能存在别名的指针时通过指针重新加载数据,这会导致严重的管道停顿,称为 load-hit-store。 .
const
和restrict
是不同的概念,并不是const
就意味着restrict
。 const
的意思是您不会在该函数的范围内通过该指针进行写入。 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/
我有一个编译错误: error C3848: expression having type 'const unicode::endian_swap' would lose s
在N3421 - Making Operator Functors greater<> , std 函数对象的新特化是: template <> struct plus { template a
我找到了这个tutorial关于正则表达式,虽然我直观地理解“贪婪”、“不情愿”和“占有”限定符的作用,但我的理解似乎存在严重漏洞。 具体来说,在以下示例中: Enter your regex: .*
我是一名优秀的程序员,十分优秀!