Que*_*tin 5 c compiler-optimization restrict-qualifier
我在C11标准中涉及restrict限定符时遇到了这两个部分:
1#
6.7.3-8
通过限制限定指针访问的对象与该指针具有特殊关联.这种关联在下面的6.7.3.1中定义,要求对该对象的所有访问直接或间接地使用该特定指针的值.135)限制限定符(如寄存器存储类)的预期用途是促进优化,并删除预选赛的所有实例的所有预处理翻译单元组成一个符合规范的程序不会改变它的意义(即,观察到的行为).
你能解释一下草书片段的含义吗?在我的解释中,由于它没有改变它的含义,看起来使用restrict它只是毫无意义......
2#
6.7.3.1-6
翻译人员可以自由地忽略使用限制的任何或所有别名含义.
这些混叠的含义可能是什么?你能告诉我一些例子吗?
限制并非毫无意义,它允许编译器进行优化,否则如果可能存在指针别名则不允许.例如,以下功能:
int foo(int *a, int *b)
{
*a = 5;
*b = 6;
return (*a + *b);
}
Run Code Online (Sandbox Code Playgroud)
这个函数返回什么?如果你说11,你只是部分正确.它返回,11除非a == b它返回12,或者更糟的是,它与b部分重叠,这可能是几个值之一.为了确保它的行为正确,编译器必须发出代码
1) stores 5 to a
2) stores 6 to b
3) loads a into a temporary register
4) adds the temp and 6
5) returns the sum
Run Code Online (Sandbox Code Playgroud)
如果您作为程序员知道a == b永远不会发生,您可以告诉编译器您不希望它使用restrict关键字担心这种情况.
int foo(int * restrict a, int * restrict b)
Run Code Online (Sandbox Code Playgroud)
将为此函数生成的代码将是:
1) store 5 to a
2) store 6 to b
3) return 11
Run Code Online (Sandbox Code Playgroud)
编译器能够进行优化,因为您承诺它不存在别名问题.并且,根据标准,如果编译器只是选择忽略restrict关键字,它将生成的代码将只是第一种情况下的符合(未优化)代码,对于您关心的所有实例仍然会以相同的方式工作.
第一句话中的草书声明基本上说:
#define restrict代码中添加一行而不更改c代码的任何含义来定义restrict关键字.由于错过了优化,您的代码可能会变慢一些,但在所有情况下,您都会得到相同的确定性结果,就像您使用restrict关键字一样.第二段意味着编译器可以自由地忽略restrict关键字.很简单.
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |