C中“限制”的关键字相反?

时间:2016-09-07 15:29:04

标签: c restrict strict-aliasing

由于严格别名可能有助于编译器更好地优化,因此C99引入了restrict关键字,如果程序员保证不会通过指向其他类型的指针访问它,则可以将其用作变量的限定符。但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名。因此,变通方法是通过传递-fno-strict-aliasing(GCC标志)来禁用全局严格别名优化。这完全没有意义,因为可能只有两个指针不应该完全优化。因此,为什么不引入相反的restrict关键字,它告诉编译器不要假设这两个指针指向不同的地址。这有点类似于volatile所做的,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们。是否可以创建这样的关键字?

编辑:有一种方法可以解决这个问题。请参阅下面的yano's评论。

1 个答案:

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