为什么传递值参数经常使编译器更容易进行代码优化
Why does pass-by-value parameters often make code optimization easier for the compiler?
我正在并行学习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);
}
}
用两个词:别名分析。请记住(例如)const int &r
并没有声明r
是对不变整数的引用,而是对一个可能没有使用来更改它的整数的引用。因此,任何时候对anyint
的写操作都可能是对r
的引用,必须重新加载r
的值,并且不能发生公共子表达式消除和代码移动。如果r
是本地int
对象,编译器通常可以证明其地址从不转义;则它可以忽略对任何其他内容的任何写入,通常允许r
保留在寄存器中或提前丢弃。
这在你引用的文章中被作为旁白,因为在有问题的情况下它不那么重要:Mat
必须包含一个指向底层图像数据的指针,所以即使Mat
是按值传递的,也可能出现一些混叠。(能够证明指针本身的情况可能会带来一些好处,但这必须与引用计数或类似的费用相比较。)
相关文章:
- 使用额外的变量使计算更容易理解 - (多少)我减慢了代码的速度?
- 为什么传递值参数经常使编译器更容易进行代码优化
- 让使用函数指针作为模板参数的任何方法更容易
- 如何使用Boost(Lambda?)使std::sort()更容易
- 碰撞检测和时间复杂性:如何使检查碰撞更容易
- 一个更容易的拷贝分配操作符实现
- 如何创建一个线性搜索算法比我的教科书提供的更容易
- 在窗口循环中,在窗口控件上获取鼠标移动比子类化更容易
- 什么类型的设计模式使事件更容易
- 更容易在QTreeView中找到QModelIndex的可见行
- 加载屏幕更容易的方法?c++
- 宏使属性更容易
- 函子——它们是用来使操作符重载更容易吗?
- 按照每个通用寄存器的用途对 x86 程序集进行编码是必要还是更容易
- std::vector比std::list (STL容器)更容易失败
- c++ ||添加两个矩阵的方式更容易输出
- 哪种技术更容易被编译器分析?
- 如何使信息记录更容易
- c++模板风格,旨在更容易理解编译器错误消息
- 我们是否可以在不同的类中分离主序列化方法,以便使用c++的boost库使其更容易和不那么复杂?