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