Может ли компилятор провести локальную копию Const Const & Vector Parameter?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Может ли компилятор провести локальную копию Const Const & Vector Parameter?

Сообщение Anonymous »

Рассмотрим эти две функции: < /p>

Код: Выделить всё

int foo(std::array const& v) {
auto const w = v;
int s{};
for (int i = 0; i < v.size(); ++i) {
s += (i % 2 == 0 ? v : w)[i];
}
return s;
}

int bar(std::array const& v) {
return std::accumulate(v.begin(),
v.end(),
0,
std::plus{});
}
Они делают точно то же самое, если не тот факт, что foo делает это неловко, сделав константу копию аргумента v , а затем выбирая элементы альтернативы из v и из копии w .
clang может видеть, что и та же самая функция (Gr/> Clang может видеть, и Generies the Assembly для двух функций. Оптимизация).
Если я изменяю std :: array на std :: vector повсюду, однако два выхода сборки различаются; В частности, я вижу вызовы к новому + and delete performed in foo, corresponding to w initialization at auto const w = v; and destruction at } respectively.
I assume that difference in the assembly maps to foo and bar behaving differently exception-wise, in that the allocation caused by auto const w = v; could fail В foo , в то время как в баре .
нет распределения. " Если распределение на Auto const w = v; добивается успеха , то выполнение кода такое же, как если бы W было изменено на v , так что я мог бы также сделать это упрощение и даже предотвратить любое исключение" ? распределение ", < /p>

Код: Выделить всё

int foo(std::optional const& v, bool b) {
auto const w = v;
return (b ? v : w).value();
}

int bar(std::optional const& v) {
return v.value();
}
и clang генерирует ту же сборку (за исключением использования Test в foo и cmp в bar , чтобы проверить, не необязательно has_value , но это нефункциональная разница).


Подробнее здесь: https://stackoverflow.com/questions/797 ... -parameter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»