C++ 在哪些情况下,应用于返回值的限制限定符会起作用?

C++ 在哪些情况下,应用于返回值的限制限定符会起作用?,c++,restrict-qualifier,C++,Restrict Qualifier,如果我有这样声明的成员函数: double* restrict data(){ return m_data; // array member variable } restrict关键字能做些什么吗 ,但是否还有其他编译器/体系结构可以使用这种类型的构造,并允许优化机器代码生成 我这样问是因为Blitz库(Blitz++)有一系列函数都是以这种方式声明的,除非它真的做了什么,否则没有人会加入restrict关键字。因此,在我开始删除限制之前(为了消除编译器警告),我想知道我是如何滥用代

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

double* restrict data(){
    return m_data; // array member variable
}
restrict关键字能做些什么吗

,但是否还有其他编译器/体系结构可以使用这种类型的构造,并允许优化机器代码生成


我这样问是因为Blitz库(Blitz++)有一系列函数都是以这种方式声明的,除非它真的做了什么,否则没有人会加入restrict关键字。因此,在我开始删除
限制之前(为了消除编译器警告),我想知道我是如何滥用代码的。

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

我们在谈论什么
限制

restrict
目前是非标准的。。这意味着它是一个编译器扩展;它是不可移植的,因为C++标准没有强制它的存在,也没有任何正式的文本告诉我们它应该做什么。

<代码>限制当前是C++中的编译器,并且必须求助于编译器的文档来准确地查看它正在做什么。


一些想法

关于
restrict
的用法,有很多论文,其中:

有几个地方暗示,
restrict
的目的是限定指针,以便编译器知道同一范围内的两个指针不引用同一内存位置

考虑到这一点,我们可以很容易地看到返回类型与其他指针没有潜在的冲突,因此在这样的上下文中使用它通常不会获得任何优化机会。然而;一个必须参考所用实现的记录行为才能确定。。如上所述:
restrict
不是标准


我还发现了以下线程,其中Blitz++的开发人员讨论了如何删除应用于函数返回类型的
strict
,因为它不起任何作用:


一点提示

作为进一步说明,以下是关于
noalias
vs
restrict
的说明:

对于函数返回值,C99的restrict没有意义,而LLVM的noalias则没有意义


谢谢,但是这个(类似的)例子包含了代码>限制/C++ >应用于函数参数(和类似的)而不是函数返回值。代码>限制<代码>是一个有效的标识符,因此它不能是一个符合编译器的关键字。@ AaltoSkes我会更新帖子,你是正确的,确认一个C++编译器不能有<代码>限制< /代码>作为关键字。编辑:已修复。提供的答案中是否有不清楚的地方?我正在寻找一个对返回值应用限制会产生影响的用例。在任何常见的实现中都没有这种情况,C标准中
restrict
的基本原理不包括返回语句中的任何用法。Blitz++库开发中的此邮件线程的内容进一步支持了这一点: