我的问题涉及C中的限制限定符和LLVM中的别名属性作为函数参数时的不同语义。
根据小名
这表明,在函数执行期间,通过基于参数或返回值的指针值访问的对象也不会通过不基于参数或返回值的指针值进行访问。
在限制限定符的情况下,C11 (例3,page124,sect. )6.7.3.1)草案提供了一个示例,其中两个限制参数之间存在别名,只要它们只读取数据就可以了:
void h(int n, int * restrict p, int * restrict q, int * restrict r) {
int i;
for (i = 0; i < n; i++)
p[i] = q[i] + r[i];
}在我看来,上面给出的示例似乎不符合no别名的语义。是这种情况吗?
发布于 2016-10-25 05:05:01
正如Jens所建议的那样,深入了解链接使我进入了AliasAnalysis页面,该页面指出:
最明显的例子是当两个指针指向不重叠的内存范围时。另一种情况是,这两个指针只用于读取内存。另一种情况是,当内存被释放并在通过一个指针进行访问和通过另一个指针进行访问之间重新分配时--在这种情况下,存在依赖关系,但它是通过自由和重新分配来实现的。
这解决了一个问题:在函数参数中,noalias属性等价于C restrict限定符。
https://stackoverflow.com/questions/40223359
复制相似问题