为什么传递值参数经常使编译器更容易进行代码优化

Why does pass-by-value parameters often make code optimization easier for the compiler?

本文关键字:更容易 编译器 代码优化 常使 值参 参数 为什么      更新时间:2023-10-16

我正在并行学习C++和OpenCV。我正在阅读以下内容,但有点不清楚为什么传递值参数通常会使编译器更容易进行代码优化。

最后一点,您可能会对我们的图像修改感到惊讶函数使用传递值图像参数。这是有效的因为当复制图像时,它们仍然共享相同的图像数据。因此,当你想修改它们的内容。顺便提一下,传递值参数通常使编译器更容易进行代码优化。

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是对不变整数的引用,而是对一个可能没有使用来更改它的整数的引用。因此,任何时候对anyint的写操作都可能是对r的引用,必须重新加载r的值,并且不能发生公共子表达式消除和代码移动。如果r是本地int对象,编译器通常可以证明其地址从不转义;则它可以忽略对任何其他内容的任何写入,通常允许r保留在寄存器中或提前丢弃。

这在你引用的文章中被作为旁白,因为在有问题的情况下它不那么重要:Mat必须包含一个指向底层图像数据的指针,所以即使Mat是按值传递的,也可能出现一些混叠。(能够证明指针本身的情况可能会带来一些好处,但这必须与引用计数或类似的费用相比较。)