为什么按值传递参数通常使编译器的代码优化更容易?

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

我正在同时学习 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 并未声明 [​​=11=] 是对 不变 整数的引用,而是对可能不是 [=24] 的整数的引用=]用来改变它。所以任何时候写入 any int 可能 r 的引用,[= 的值11=]必须重新加载,不能出现公共子表达式消除和代码移动。如果r是局部int对象,编译器往往可以证明它的地址从不逃逸;然后它可以忽略对其他任何内容的任何写入,通常允许 r 留在寄存器中或提前丢弃。

这在您引用的段落中作为旁白给出,因为它在所讨论的情况下不太重要:Mat 必须包含指向基础图像数据的指针,因此即使在Mat 按值传递。 (能够证明关于指针本身的事情可能会带来一些好处,但这必须以引用计数或类似的费用为代价。)