我正在并行学习 C++ 和 OpenCV。我正在阅读以下内容,但有点不清楚为什么按值传递参数通常会使编译器更容易进行代码优化。
As a last note, you might have been surprised by the fact that our image modifying function uses a pass-by-value image parameter. This works because when images are copied, they still share the same image data. So, you do not necessarily have to transmit images by references when you want to modify their content. Incidentally, pass-by-value parameters often make code optimization easier for the compiler.
void salt(Mat image, int n)
{
default_random_engine generator;
uniform_int_distribution<int> randomRow(0, image.rows - 1);
uniform_int_distribution<int> randomCol(0, image.cols - 1);
for (int k = 0; k < n; k++)
{
int i = randomCol(generator);
int j = randomRow(generator);
if (image.type() == CV_8UC1)
image.at<uchar>(j, i) = 255;
else if (image.type() == CV_8UC3)
image.at<Vec3b>(j, i) = Vec3b(255, 0, 0);
}
}
最佳答案
用两个词来说:别名分析。请记住(例如)const int &r
不会将 r
声明为对不变整数的引用,而是对可能发生变化的整数的引用。不能使用来改变它。因此,任何时候对 any int
可能 的写入可能是 r
的引用,的值>r
必须重新加载,并且公共(public)子表达式消除和代码移动不能发生。如果r
是一个本地int
对象,编译器通常可以证明它的地址永远不会逃逸;然后它可以忽略对其他任何内容的任何写入,通常允许 r
保留在寄存器中或提前丢弃。
这是在您引用的段落中作为旁白给出的,因为在所讨论的情况下它不太重要:Mat
必须包含指向基础图像数据的指针,因此即使在Mat
按值传递。 (能够证明有关指针本身的事情可能会带来一些好处,但这必须针对引用计数或类似的费用进行设置。)
关于c++ - 为什么按值传递参数通常会使编译器更轻松地优化代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54102201/