为什么传递值参数常常使编译器更容易进行代码优化? 我同时学习C++和OpenCV。我正在阅读下面的内容,这有点不清楚为什么传递值参数常常使编译器更容易进行代码优化

为什么传递值参数常常使编译器更容易进行代码优化? 我同时学习C++和OpenCV。我正在阅读下面的内容,这有点不清楚为什么传递值参数常常使编译器更容易进行代码优化,c++,opencv,optimization,pass-by-value,C++,Opencv,Optimization,Pass By Value,最后,您可能会惊讶于我们的图像修改 函数使用传递值图像参数。这很有效 因为复制图像时,它们仍然共享相同的图像数据。 因此,当需要时,您不必通过引用传输图像 您想修改它们的内容。顺便提一下,传递值参数 通常会使编译器更容易进行代码优化 void salt(Mat图像,int n) { 默认的随机引擎生成器; 均匀分布随机行(0,image.rows-1); 均匀分布随机化(0,image.cols-1); 对于(int k=0;k

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

void salt(Mat图像,int n)
{
默认的随机引擎生成器;
均匀分布随机行(0,image.rows-1);
均匀分布随机化(0,image.cols-1);
对于(int k=0;k
用两个词:别名分析。请记住(例如)
const int&r
并没有将
r
声明为对不变整数的引用,而是对不可用于更改它的整数的引用。因此,任何时候对任何
int
的写入可能是对
r
的引用对象的写入,都必须重新加载
r
的值,并且不能发生公共子表达式消除和代码移动。如果
r
是本地
int
对象,编译器通常可以证明它的地址永远不会转义;然后,它可以忽略对其他任何内容的任何写入,通常允许
r
保留在寄存器中或提前丢弃

这在您引用的文章中是作为旁白给出的,因为它在所讨论的案例中不太重要:
Mat
必须包含指向底层图像数据的指针,因此即使通过值传递
Mat
,也可能出现一些混叠。(能够证明指针本身的情况可能会带来一些好处,但这必须与引用计数或类似计算的费用相对应。)

可能会回答您的部分问题。
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);
    }
}