c++ - 为什么按值传递参数通常会使编译器更轻松地优化代码?

标签 c++ opencv optimization pass-by-value

我正在并行学习 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/

相关文章:

java - 迭代和递归解决方案的时间复杂度

c++ - "as-if"规则到底是什么?

c++ - Linux:使用 OpenGL 4.x

Opencv 库中的 Python 函数原型(prototype)

math - 通过将它们转换为更大的整数数据类型来一次添加整个字节数组是否有效?

python - 最大方程长度

c++ - 在 C++ 中复制具有宽字符串路径的文件

c++ - 为回调函数传递参数

c++ - 在 opencv c++ 中查找图像卷积时出现段错误(核心转储)错误

python - VideoCapture() opencv python pyinstaller 打不开