由于严格别名可能有助于编译器更好地优化,因此C99引入了restrict
关键字,如果程序员保证不会通过指向其他类型的指针访问它,则可以将其用作变量的限定符。但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名。因此,变通方法是通过传递-fno-strict-aliasing
(GCC标志)来禁用全局严格别名优化。这完全没有意义,因为可能只有两个指针不应该完全优化。因此,为什么不引入相反的restrict
关键字,它告诉编译器不要假设这两个指针指向不同的地址。这有点类似于volatile
所做的,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们。是否可以创建这样的关键字?
编辑:有一种方法可以解决这个问题。请参阅下面的yano's评论。
答案 0 :(得分:0)
鉴于代码:
int foo(int * restrict p)
{
*p = 3;
someOutsideFunction();
return *p;
}
编译器有权假设只要p
在范围内,就没有对象
使用*p
编写的内容将通过除via之外的任何方式访问
复制或以其他方式导出的指针"来自 p
的。对象的其他指针可能存在于Universe中的其他位置,但在foo
返回之前,它们都不可用于访问*p
。因此,编译器可以用
int foo(int * restrict p)
{
someOutsideFunction();
*p = 3;
return 3;
}
因为它可以看到没有复制或从p
派生的指针以someOutsideFunction
可以看到它的方式暴露,因此someOutsideFunction
没有合法的方式来访问该对象*p
。
如果someOutsideFunction
可以 - 编译器处理foo
不知道 - 包括一个与restrict
相反的关键字,并且可以允许它访问p
标识的对象{1}} [从全局变量或其他此类方法接收指向该对象的指针],这将使编译器处理foo
无法知道someOutsideFunction
是否可以访问*p
,因此无法知道它是否可以安全地应用指示的优化。