Войти
ФлеймФорумПрограммирование

C++. Auto. Добро или Зло? (13 стр)

Страницы: 110 11 12 13 14 15 Следующая »
#180
17:08, 1 июля 2019

oxotnik
> Еще раз объясняю.
Что может объяснить человек, для которого вызов конструктора перемещения и копирования - одно и то же? Лучше молчите.


#181
17:15, 1 июля 2019

totoro
Ок. Перемещайте дальше свой array надеясь на отсуствие копирования. Бесполезно объяснять. Потом из-за таких ПО тормозит...

#182
17:25, 1 июля 2019

oxotnik
> Ок. Перемещайте дальше свой array надеясь на отсуствие копирования. Бесполезно
> объяснять. Потом из-за таких ПО тормозит...
посмотри ещё раз с чём споришь:

#include <iostream>
#include <array>
using namespace std;

struct Boo
{
  Boo() = default;
  Boo(Boo &&) { cout << "move ctor\n"; }
    Boo(const Boo &) { cout << "copy ctor\n"; }
};

int main()
{
    std::array<Boo, 1> a{Boo()};
  auto a1 = a;
    auto a2 = std::move(a);
}
copy ctor
move ctor

а теперь добавь field/member в "Boo" типа "vector<vector<vector<t_node>>>" и обработку его перемещения/копирования.

#183
(Правка: 17:40) 17:31, 1 июля 2019

Adler
Ну это то понятно очевидно.
Но не отменяет того факта, что перемещение array медленная операция.

PS: данную структуру вектор перемещать не будет
pss: user defined конструкторы зло https://godbolt.org/z/6uHCSp

#184
17:58, 1 июля 2019

*Lain*
> ну ты по своей ссылке то сходи, никаких нью
Сходил. Ты не поверишь, я там вижу new.
Это еще одно подтверждение того, что любители auto не умеют читать.
Попробуй сконцентрироваться и прочесть именно тот пост, на который я оставлял ссылку, а не какой-то соседний.
Я даже продублиру ссылку сюда еще раз (а то мало ли, не по той ссылке перейдешь):
https://gamedev.ru/flame/forum/?id=245260&m=5001454#m2
Концентрация на посте номер 2. Номер два. #2

#185
(Правка: 18:20) 18:16, 1 июля 2019

oxotnik
> Но не отменяет того факта, что перемещение array медленная операция.
понятное дело, "перемещение array медленная операция" по сравнению с чем-то другим очень важным с чей-то точки зрения.
но обычно когда надо переместить "std::array", то как бы его перемещение через копирование строго не быстрее, чем его перемещение через "move constructors".

#186
18:19, 1 июля 2019

Kartonagnick

> никак не следует, что язык я знаю так себе
Если хочешь, мне опыт подсказывает. Один мудрец сказал:

People who think they know everything really annoy those of us who know we don't

Хотя, в сраче про signed/unsigned ты вроде бы презирал мнение этих дураков из комитета.
И да, я реально считаю, что не знаю С++. А еще мне реально смешно слышать, когда кто-то утверждает, что его знает. Особенно учитывая динамику внедрения туда новых возможностей и бесчисленного числа особенностей разных компиляторов.
Потом, почему тебя так волнует, что я думаю о тебе?

> только у совсем зеленого новичка. тупо из-за неопытности.
Объясняю еще раз, специально для гур. Вот ты смотришь changeset на 1000 строк в каком-нибудь gerrit'e. Тебе нужно сказать - пойдет этот changeset дальше или нет. И тут ты видишь приведенную мною строчку. Ее мог написать зеленый новичок, мог красный, а мог написать суперпрофессионал С++. Но тебе пофигу кто ее написал, тебе нужно из контекста сказать - правильно это или нет.
И вот ты глядишь на тот самый changeset и гадаешь:
1. Нет амперсанда, это неправильно.
2. Нет амперсанда, это правильно, get_blob наверное возвращает прокси.
3. Блин, а может быть тут все-таки нужен амперсанд?
4. Или вообще const auto&?
Теперь спрашивается - а нахрена тебе это нужно? Да пошел этот зелено-красный профессионал С++ в жопу со своим changeset'ом, где этого говна через каждые пять строчек.
Суть же гайдлайнов как раз в том и состоит, чтобы отличать пахнущий код от нормального одним только взглядом. Про это еще Спольски писал, только немного в другом контексте.

> как можно было профакапить амперсанд у auto
Может такой гуру С++, как ты, составит нам чеклист - когда амперсанд нужен, а когда нет?

> и вот теперь ты пишешь о проблемах читабельности во множественном числе
Ну хорошо, пускай проблема со ссылкой - не проблема. Я даже знаю что ты про циклы скажешь - зеленые, детские, новички. Мы, гуры, таких ошибок никогда не делаем и вообще. Про

auto var = { 1 };
ты еще что-нибудь подобное скажешь. И вообще на любой приведенный пример твой ответ всем известен и его суть заключается примерно следующем:
Изображение

#187
(Правка: 18:26) 18:25, 1 июля 2019

Adler
быстрее всего через copy/move elision
а в случае rvalue/lvalue ссылки copy/move elision не сработает

#188
(Правка: 18:45) 18:32, 1 июля 2019

Ghost2
> auto var = { 1 };
очевидно, это какой-то initializer_list, какие проблемы то?

oxotnik
> быстрее всего через copy/move elision
да, а ещё иногда в результате ручного "copy/move elision" можно родить "std::array<vector<vector<vector<t_node>>>>" и это например даже какое-то время будет как бы быстрее всего :)
то есть с какой-то точки зрения "move constructors" - это порождение ручного "copy/move elision".

totoro
> Что может объяснить человек, для которого вызов конструктора перемещения и
> копирования - одно и то же? Лучше молчите.
надо было тебя послушать :)

Ghost2
> И вот ты глядишь на тот самый changeset и гадаешь:
это исключительно проблемы организации отражённые "в каком-нибудь gerrit'e" который не может в вывод типов, а не "auto"/синтаксиса.

#189
19:00, 1 июля 2019

Adler

> очевидно, это какой-то initializer_list, какие проблемы то?
Проблемы дальше:

auto a = { max_size };
std::vector<int> v(a);
Вот только не надо о том, что это ошибки новичков, так никто не пишет и прочий гуру-булшит про знание С++. Нужны правила для формальной оценки качества кода. Я привел пример такого правила несколько страниц назад. Ты с ним не согласен?

> это исключительно проблемы организации отражённые
Это исключительно проблемы читаемости.

> который не может в вывод типов, а не "auto"/синтаксиса
Не может в вывод типов тот, кому нужно для этого что-то кроме листинга.

#190
19:05, 1 июля 2019

Ghost2
> Про
> auto var = { 1 };
> ты еще что-нибудь подобное скажешь.
  Последним аргументом в арсенале "auto-прагматиков" наверное будет такой:

auto var;  // азаза, ауто биспалезен!
#191
(Правка: 19:11) 19:09, 1 июля 2019

Ghost2
> Я привел пример такого правила несколько страниц назад. Ты с ним не согласен?
зачем мне его читать? напиши checker/convertor и прикрути/воткни его в "каком-нибудь gerrit" или вообще в цепочку/toolchain доставки commit`ов и всё: проблема решена раз и как бы на всегда, даже объяснять ничего не надо никому и читать тупые комментарии в gerrit про "добавь вот тут пробел перед/после скобки". :)

#192
(Правка: 19:19) 19:19, 1 июля 2019

Adler

> зачем мне его читать?
Так в этом и суть сабжа: auto, за несколькими исключениями (перечисленными в правиле короче, забей), придумано в основном для пейсателей.

#193
19:20, 1 июля 2019

Zefick

> азаза, ауто биспалезен!
Ты видимо обчитался, я нигде не говорил, что auto бесполезен.

#194
(Правка: 20:14) 20:13, 1 июля 2019

totoro
> Такого типа не существует в языке С++, поэтому все логично.
Жопы типа нет, а слово выражение для его записи есть. Напрямую - нет, но после небольшого обходного манёвра - уже есть. Вот такой парадокс.


pahaa
> Логично было бы ожидать ошибку синтаксиса, или что?
Логично ожидать, что в коде:

template <class T>
void update_T (T &t)
{
 T innerT = t;
 ...
 if (needAnotherT) innerT = anotherT;
 …
 if (goodResult) t = innerT;
}
изменение переменной, на которую ссылается t, произойдёт только по команде t =…
Но внезапно, если T - например, int &, то это не так.
И ещё более внезапно -
int i;
update_T (i); // вызовется специализация для T = int или для T = int &?
Вот такую цену мы заплатили за кодификацию ссылки.

Adler
> Это я к тому, что в теории при правильно настроенной системе разработчик
> конкретного компонента можно спокойно и без объяснения причин закинуть "наверх"
> любой дефект основанный на связях между компонентами, т.к это должна быть не
> его зона/область ответственности.
Угу. Вот буквально щас пришлось обрабатывать один такой баг. Система выпала с коркой, 2 нижних элемента стека из стдлиба (где-то в конструкторе std::string), 3 следующих - из нашего компонента, выше - из другого компонента. Проштудировал все параметры стека, попадающие в наш компонент - ничего коррумпированного. Проштудировал затронутый код нашего компонента (клиентская библиотека от него) - там используются только значения входных параметров, везде адекватно обрабатываются и обёрнуты адекватными гвардами, сегфолту взяться неоткуда. Вывод - коррупция хипа, и происходит не в нашем компоненте. И где в данной процедуре было место твоему "наверху"?

Страницы: 110 11 12 13 14 15 Следующая »
ФлеймФорумПрограммирование