我很清楚何时对函数参数使用restrict。但到目前为止我发现的所有文章都没有提到其他声明(比如函数返回值和局部变量)。
以下是一个例子:
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的包装器),我应该让它们返回restrict吗? 我应该制作foo和bar限制吗?
答案 0 :(得分:4)
返回restrict
没有意义,就像返回const
或volatile
一样。这是因为函数的返回值纯粹是值表达式(“rvalue”),而不是表示对象(“左值”)的表达式。我不知道如何在没有GCC属性的函数类型中编码非别名的知识(你可以将函数标记为malloc
- ),但调用者可以自由地将结果存储在restrict
- 限定指针对象,从而为编译器提供这方面的知识。