Почему параметры передачи по значению часто облегчают оптимизацию кода для компилятора? - PullRequest
0 голосов
/ 09 января 2019

Я изучаю 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);
    }
}

1 Ответ

0 голосов
/ 10 января 2019

В двух словах: анализ псевдонимов . Помните, что (например) const int &r не объявляет r ссылкой на неизменное целое число, но является ссылкой на целое число, которое не может быть использовано для его изменения. Таким образом, в любое время, когда запись в any int может быть референтом r, значение r должно быть перезагружено, и устранение общего подвыражения и движение кода не может произойти. Если r является локальным int объектом , компилятор часто может доказать, что его адрес никогда не экранируется; тогда он может игнорировать любую запись во что-либо еще, часто позволяя r оставаться в регистре или отбрасываться досрочно.

Это было указано в качестве отрывка в цитируемом вами отрывке, поскольку в данном случае это менее важно: Mat должен содержать указатель на данные базового изображения, поэтому возможен некоторый псевдоним, даже если Mat передается по значению. (Возможность доказать что-то о самом указателе может дать некоторую выгоду, но это должно быть сопоставлено с затратами на подсчет ссылок или тому подобное.)

...