Управление std::array в функции
У меня есть многомерный массив фиксированного размера в моем коде, и мне нужно иметь возможность изменять значения в нем в отдельной функции. Я хочу знать, передаются ли 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 ответа
Передайте по ссылке (или указателю), если вы хотите избежать копирования:
void foo (array<array<int,WIDTH>,HEIGHT> &bar);
Я хочу знать, передаются ли std:: массивы как ссылки в методе, или копия сделана?
std::array
это тип значения Если вы передадите по значению, будет сделана (концептуально) копия.
Это отличается от поведения массива c-style (int bar[HEIGHT][WIDTH]
). Массивы в стиле c передаются по ссылке. Это связано с фундаментальным конструктивным решением (некоторые скажут, что ошибка) на языке C много месяцев назад.
мне нужно явно превратить его в ссылку?
Если вы хотите передать ссылку, да.
Я боюсь, что если бы я создал функцию массива, которая вернула копию, это было бы слишком грязно
Функциональные программисты утверждают, что это было чище.
и не так быстро.
Будьте осторожны с такими предположениями. По другим причинам,
а) компиляторы не всегда делают так, как вы им говорите. Они могут написать код, который будет иметь тот же эффект, что и если бы они сделали то, что вы им сказали, но достигли того же результата быстрее. (Google: "как-будто правило C++")
б) Современные архитектуры ЦП специально спроектированы так, чтобы быть чрезвычайно хорошими при перемещении смежных блоков памяти.
Напишите самый чистый код, который вы можете, используя абстрактные понятия, чтобы четко выразить свое намерение. Если программа работает слишком медленно, использует слишком много памяти, использует слишком много энергии или ваши конечные пользователи жалуются, тогда, возможно, настало время позаботиться об оптимизации по ссылке или по значению.
Тем не менее, я могу заверить вас, что любые задержки, которые вы наблюдаете в скорости выполнения, с большей вероятностью будут связаны с вашим лечением ввода-вывода или из-за выбора алгоритмов, демонстрирующих высокую временную сложность.