我有一个与此类似的函数签名
void Mutliply(const MatrixMN& a, const MatrixMN& b, MatrixMN& out);
矩阵类内部有一个float* data;
表示m x n
组件。我想告诉编译器 a
和 b
不会为输出矩阵设置别名,因此它不会执行大量加载存储。
我该怎么做?我知道我可以传递指向函数签名的指针,并用 __restrict
(在 MSVC 中)标记指针,但我想保留通过引用传递对象的习惯用法,其中对象包含指向内存的指针。
我也知道 __restrict
不适用于对象引用。
最佳答案
根据优化器的工作方式,顶部的 assert(&in1 != &out && &in2 != &out)
可能会起作用。您还可以去掉 out 参数,并相信优化器会去掉多余的拷贝(当然,假设它是一个纯 out 参数)。如果代码是内联的候选者,编译器可能看不到任何别名。如果 restrict
确实对引用参数不起作用,您可以对函数调用有一个额外的级别,并将所有三个传递给接受适当限制的指针的第二个函数。希望那个会为你内联。
关于c++ - 防止两个对象内部发生别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287395/