1

我非常了解何时将限制用于函数参数。但是到目前为止我发现的所有文章都没有提到其他声明(如函数返回值和局部变量)。

这是一个例子:

extern int *alloc_foo(void);
extern int *alloc_bar(void);

int *foo = alloc_foo();
foo[i] = 42;
int *bar = alloc_bar();
f(foo[i]);

如果 alloc_foo() 和 alloc_bar() 保证返回非别名地址(比如如果有 malloc 的包装器),我应该让它们返回限制吗?我应该限制 foo 和 bar 吗?

4

1 回答 1

4

回归restrict没有意义,就像回归constvolatile不回归一样。这是因为函数的返回值纯粹是一个表达式(“rvalue”),而不是表示对象的表达式(“lvalue”)。我不知道有什么方法可以在没有 GCC 属性的情况下对函数类型中的非混叠知识进行编码(您可以将函数标记为malloc-like),但调用者可以自由地将结果存储在restrict-qualified 指针对象中并且从而为编译器提供这些知识。

于 2015-02-01T00:05:15.380 回答