2

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

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

限制关键字可以做任何事情吗?

显然,对于 g++(x86 架构)它不能,但是是否有其他编译器/架构可以使这种类型的构造有意义,并允许优化机器代码生成?

我问是因为 Blitz 库 (Blitz++) 有一大堆以这种方式声明的函数,除非它真的做某事,否则有人会进入并添加限制关键字是没有意义的。因此,在我进入并删除restrict's(以摆脱编译器警告)之前,我想知道我是如何滥用代码的。

4

2 回答 2

3

restrict我们在谈论什么?

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

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


一些想法

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

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

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


我还发现了以下线程,Blitz++的开发人员讨论了删除strict应用于函数的返回类型,因为它没有做任何事情:


一点注意事项

作为进一步说明,这是LLVM 文档中关于noaliasvs的说明restrict

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

于 2014-05-30T19:49:58.990 回答
0

一般限制限定符只能帮助更好地优化代码。通过删除“限制”,您不会破坏任何东西,但是当您不小心添加它时,您可能会遇到一些错误。一个很好的例子是 memcpy 和 memmove 之间的区别。您始终可以使用较慢的 memmove,但只有在您知道 src 和 dst 不重叠时才能使用更快的 memcpy。

于 2014-05-30T19:39:45.087 回答