c++ - 防止两个对象内部发生别名

标签 c++ pointer-aliasing restrict-qualifier

我有一个与此类似的函数签名

void Mutliply(const MatrixMN& a, const MatrixMN& b, MatrixMN& out);

矩阵类内部有一个float* data; 表示m x n 组件。我想告诉编译器 ab 不会为输出矩阵设置别名,因此它不会执行大量加载存储。

我该怎么做?我知道我可以传递指向函数签名的指针,并用 __restrict(在 MSVC 中)标记指针,但我想保留通过引用传递对象的习惯用法,其中对象包含指向内存的指针。

我也知道 __restrict 不适用于对象引用。

最佳答案

根据优化器的工作方式,顶部的 assert(&in1 != &out && &in2 != &out) 可能会起作用。您还可以去掉 out 参数,并相信优化器会去掉多余的拷贝(当然,假设它是一个纯 out 参数)。如果代码是内联的候选者,编译器可能看不到任何别名。如果 restrict 确实对引用参数不起作用,您可以对函数调用有一个额外的级别,并将所有三个传递给接受适当限制的指针的第二个函数。希望那个会为你内联。

关于c++ - 防止两个对象内部发生别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287395/

相关文章:

c++ - 如何告诉 C 或 C++ 编译器指针没有别名

python - 混淆别名

c - 何时使用 restrict 何时不使用

c++ - 位模式匹配和替换

c++ - CATCH_CONFIG_MAIN 的 gtest 等价物是什么?

c++ - 将 float 加到零的精度

c - 别名 "const restrict"指针参数是否合法?

c - pre-c99 的限制性

c++ - C++中的restrict关键字是什么意思?

c++ - 模板函数重载(泛型 vs 模板模板类型)选择正确的重载