首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么按值传递参数常常使编译器的代码优化更容易?

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

Stack Overflow用户
提问于 2019-01-09 01:45:01
回答 1查看 64关注 0票数 2

我同时学习C++和OpenCV。我正在阅读以下内容,这一点有点不清楚,为什么逐值参数常常使编译器的代码优化变得更容易。

最后,您可能会对我们的图像修改函数使用逐值图像参数这一事实感到惊讶。这是因为在复制图像时,它们仍然共享相同的图像数据。因此,当您想要修改图像内容时,不必通过引用来传输图像。顺便说一句,按值传递参数通常会使编译器更容易优化代码.

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-10 04:14:20

用两个词来形容:别名分析。请记住,(例如) const int &r并不声明r是对不变整数的引用,而是对不用于更改整数的整数的引用。因此,任何时候对任何int的写入都可能是对r的引用,因此必须重新加载r的值,并且不能发生公共子表达式消除和代码运动。如果r是一个本地int 对象,编译器通常可以证明它的地址永远不会转义;然后它可以忽略对其他任何东西的任何写入,通常允许r留在寄存器中或提前被丢弃。

这是您引用的段落中的一个旁白,因为在所讨论的情况下,它不太重要:Mat必须包含指向底层图像数据的指针,因此即使通过值传递Mat也可能出现一些混叠。(能够证明有关指针本身的东西可能会带来一些好处,但必须根据引用计数或类似的费用来设置。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54102201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档