繁体   English   中英

在哪些情况下,将限制限定符应用于返回值会产生影响?

[英]In which cases will the restrict qualifier applied to a return value have an effect?

如果我有这样声明的成员函数:

double* restrict data(){
    return m_data; // array member variable
}

limit关键字可以做什么?

显然,对于g ++(x86体系结构)来说它不能实现 ,但是是否存在其他编译器/体系结构可以使这种类型的构造有意义,并且可以优化机器代码的生成?

我之所以问是因为Blitz库(Blitz ++)具有以这种方式声明的全部功能,因此除非有人真正执行某项操作,否则有人进入并添加strict关键字是没有意义的。 因此,在我删除restrict (消除编译器警告)之前,我想知道如何滥用代码。

我们要谈什么restrict

目前, restrict是非标准的。这意味着它是编译器扩展; 从C ++标准不要求其存在的意义上说,它是不可移植的,在它里面也没有任何正式的文本可以告诉我们它应该做什么。

restrict当前是C ++中特定于编译器的,必须依靠他们选择的编译器文档才能确切了解它在做什么。


一些想法

以下是有关使用多篇论文restrict ,其中包括:

在几个地方暗示restrict的目的是限定指针,以便编译器知道相同作用域中的两个指针不指向相同的内存位置。

考虑到这一点,我们可以很容易地看到return类型与其他指针没有潜在的冲突 ,因此在这种情况下使用它通常不会获得任何优化机会。 然而; 一个必须参照使用实施记录的行为肯定知道。至于说: restrict不达标,


我还找到了以下线程, Blitz ++的开发人员在该线程上讨论了删除对函数的返回类型应用的strict ,因为它没有任何作用:


小笔记

作为进一步的说明,这里是什么LLVM文件说,有关noalias VS restrict

对于函数返回值,C99的限制没有意义,而LLVM的noalias是有意义的。

通常,限制限定符只能帮助更好地优化代码。 通过删除“限制”,您不会破坏任何内容,但是如果不加小心地添加它,则会出现一些错误。 一个很好的例子是memcpy和memmove之间的区别。 您始终可以使用速度较慢的记忆,但只有在知道src和dst不重叠的情况下,才可以使用速度较快的记忆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM