Управление std :: array в функции - PullRequest
0 голосов
/ 31 августа 2018

У меня есть многомерный массив фиксированного размера в моем коде, и мне нужно иметь возможность изменять значения в нем в отдельной функции. Я хочу знать, передаются ли std :: массивы как ссылки в методе, или копия сделана? Так что я могу сделать это:

using std::array;

void foo (array<array<int,WIDTH>,HEIGHT> bar);
//manipulates the values in the array
...

int main() {
  array<array<int,WIDTH>,HEIGHT> baz;
  ...
  foo(baz);
  //baz is changed
}

Или мне нужно явно превратить его в ссылку? Боюсь, что если бы я создал функцию массива, которая возвращала копию, она была бы слишком грязной и не такой быстрой.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я хочу знать, передаются ли std :: массивы в качестве ссылок в метод или выполняется копия?

std::array является типом значения. Если вы передадите по значению, будет сделана (концептуально) копия.

Это отличается от поведения массива в стиле c (int bar[HEIGHT][WIDTH]). Массивы в стиле c передаются по ссылке. Это связано с фундаментальным конструктивным решением (некоторые скажут, ошибка) на языке C много месяцев назад.

мне нужно явно превратить его в ссылку?

Если вы хотите передать ссылку, да.

Боюсь, что если бы я создал функцию массива, которая возвращала копию, это было бы слишком грязно

Функциональные программисты утверждают, что это было чище.

и не так быстро.

Будьте осторожны с такими предположениями. Среди прочих причин

а) Компиляторы не всегда делают так, как вы им говорите. Они могут написать код, который будет иметь тот же эффект, что и если бы они сделали то, что вы им сказали, но быстрее добились того же результата. (Google: "как-будто правило c ++")

b) Современные архитектуры ЦП специально спроектированы так, чтобы быть чрезвычайно хорошими в перемещении смежных блоков памяти.

Напишите самый чистый код, который вы можете, используя абстрактные понятия, чтобы ясно выразить свое намерение Если программа работает слишком медленно, использует слишком много памяти, использует слишком много энергии или ваши конечные пользователи жалуются, то, возможно, настало время позаботиться об оптимизации по ссылке или по значению.

Однако я могу заверить вас, что любые задержки, которые вы наблюдаете в скорости выполнения, с большей вероятностью будут связаны с вашим лечением ввода-вывода или из-за выбора алгоритмов, демонстрирующих высокую временную сложность.

0 голосов
/ 31 августа 2018

Передача по ссылке (или указателю), если вы хотите избежать копирования:

void foo (array<array<int,WIDTH>,HEIGHT> &bar);
...