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 ,因此无法知道它是否可以安全地应用指示的优化。