我同时学习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);
}
}发布于 2019-01-10 04:14:20
用两个词来形容:别名分析。请记住,(例如) const int &r并不声明r是对不变整数的引用,而是对不用于更改整数的整数的引用。因此,任何时候对任何int的写入都可能是对r的引用,因此必须重新加载r的值,并且不能发生公共子表达式消除和代码运动。如果r是一个本地int 对象,编译器通常可以证明它的地址永远不会转义;然后它可以忽略对其他任何东西的任何写入,通常允许r留在寄存器中或提前被丢弃。
这是您引用的段落中的一个旁白,因为在所讨论的情况下,它不太重要:Mat必须包含指向底层图像数据的指针,因此即使通过值传递Mat也可能出现一些混叠。(能够证明有关指针本身的东西可能会带来一些好处,但必须根据引用计数或类似的费用来设置。)
https://stackoverflow.com/questions/54102201
复制相似问题