1
14
关于restrict关键字最好的“直觉”是它的一个保证(程序员对编译器),在指针的生命周期内,通过该指针访问的内存只能通过该指针访问,而不能通过另一个指针、引用或全局地址访问。所以重要的是,它在指针上作为指针和内存的属性,将两个指针捆绑在一起,直到指针超出范围。 |
2
21
Chris Dodd对关键字有正确的描述。在某些平台中,由于性能原因,它可能非常重要,因为它让编译器知道,一旦它通过指针将数据加载到寄存器中,就不必再这样做了。如果没有这一保证,编译器必须在每次写入任何其他可能的别名指针时通过指针重新加载数据,这可能导致严重的管道暂停,称为 load-hit-store .
而你不能直接写信给
我已经
written about the
只是强调一下:这是
不
如果你关心性能的话,这是一个晦涩的或过早的优化。
|
3
8
你知道的大部分都是错的! 康斯特 不 保证编译器的背后不会发生变化。只要停下来 你 从写作到那个地方。但是,其他一些东西可能仍然能够写入该位置,因此编译器不能假定它是常量。 正如其他人所说,限制限定符是关于别名的。事实上,在C标准化的第一轮中,有一个关于“noalias”关键字的建议。不幸的是,这个提议写得相当糟糕——这促使丹尼斯·里奇在这一过程中唯一一次介入,他写了一封信,信中说“诺亚利亚必须走”。这是不允许谈判的。” 不用说,‘noalias’并没有成为C的一部分。当需要再次尝试的时候,提案写得足够好,标准中包含了限制——即使noalias可能是一个更有意义的名字,但这个名字被玷污了,我怀疑是否有人考虑过使用它。 在任何情况下,限制的主要目的都是告诉编译器此项不会有别名。这样做的一个原因是允许事物临时存储在寄存器中。例如,考虑如下内容:
编译器真的想把I放在寄存器中,并将*A加载到寄存器中,所以当需要决定是否执行循环的另一次迭代时,它只是将要注册的值相互比较。不幸的是,它不能这样做——如果使用这个函数的人完全疯了,用a==b来调用它,每次它在循环中写到*b时,这个新值也是*a的值——所以它必须在循环的每次迭代中从内存中读取*a, 以防万一 不管是谁说的都是疯子。使用restrict告诉编译器,它可以生成代码,假设a和b总是不同的,所以对*a的写入永远不会更改*b(反之亦然)。 |
4
5
你的理解基本上是正确的。这个
编译器不关心并发线程,它不会以任何不同的方式生成代码,并且您可能会根据自己的喜好删除自己的数据。但它需要知道哪些指针操作可能会改变什么全局内存。
就编译器而言,用户不需要锁定。它只想确保它正确地读取
想象上的
被代码击倒
编译器应该生成
如果没有
最后,请注意,编译器可能已经在更高的优化级别上分析了基于数据类型的可能别名,因此
我们可以看到
在右栏中,
|
5
1
熟悉标准的人可能会给出更好的答案,但我会试一试。 “数据不会在编译器后面被修改”听起来更像是“易失性”的反面。
“const”是指数据不会在程序员面前被修改;也就是说,她不能通过标记为“const”的能指修改数据(我写“能指”是因为
“限制”限定指针是关键。指针是在C中别名数据的唯一方法,因此它们是通过两个不同的名称访问某些数据的唯一方法。”restrict”是指将数据访问限制在一个访问路径上。 |
6
1
这可能是来自 极其 范围很窄,但Altera的NiosII平台是一个软核心微控制器,您可以在FPGA中定制。然后,在该micro的C源代码中,您可以使用C到硬件工具,使用自定义硬件而不是软件来加速内部循环。
在那里,使用
如果有人有兴趣阅读更多关于C2H的内容,
this PDF
讨论优化C2H结果。章节
|
Trey · C-易失性指针的使用 7 年前 |
Alex · 使用“*args”,关键字参数变为位置参数? 7 年前 |
Thamme Gowda · “lambda”关键字的较短替代项? 7 年前 |
ldenkewi · 如何在azure搜索中实际使用关键字分析器? 8 年前 |
Ander Acosta · Admob不按关键字加载广告 8 年前 |
Jackie19 · OCaml中的“更小”关键字(?) 9 年前 |