Информация об изменениях

Сообщение Re[9]: Exception-safe vector от 20.12.2022 15:32

Изменено 20.12.2022 15:38 sergii.p

Re[9]: Exception-safe vector
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, T4r4sB, Вы писали:


TB>>нахрена занулять поля, если место, занимаемое старым вектором, сразу освобождаем, без вызова деструктора?


V>Ты С++ часом со Rust не путаешь. Объект после move может быть переприсвоен и должен быть готов к assign(). Мне кажется ты слишком частный случай рассматриваешь.


так вопрос видимо об этом. Почему не сделать как в Rust? Сейчас мы платим за то, что не используем (вызываем деструкторы у пустых объектов).
Прописать в стандарте, что после перемещения обращение к объекту является ошибкой — и все проблемы решены. Ещё use after move показывает свои уши в случае когда хочется влепить const, но не можешь, потому как потом хочешь переместить. Но это уже стилистические вопросы. В общем, одна ошибка(?) и куча негативных последствий для языка.
А про 4 рубля — это как посмотреть. Возвращаясь к теме, такой простой код за счёт переаллокаций вектора вызовет 2 ^ (N + 1) — 1 вызовов ненужных деструкторов.
std::vector<std::string> res;
for(auto&& word: largeCollection) {
    res.push_back(std::move(word));
}

Оно конечно 4 рубля, но в степени N. Прям классическая задача о зёрнах на шахматной доске.
Re[9]: Exception-safe vector
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, T4r4sB, Вы писали:


TB>>нахрена занулять поля, если место, занимаемое старым вектором, сразу освобождаем, без вызова деструктора?


V>Ты С++ часом со Rust не путаешь. Объект после move может быть переприсвоен и должен быть готов к assign(). Мне кажется ты слишком частный случай рассматриваешь.


так вопрос видимо об этом. Почему не сделать как в Rust? Сейчас мы платим за то, что не используем (вызываем деструкторы у пустых объектов).
Прописать в стандарте, что после перемещения обращение к объекту является ошибкой — и все проблемы решены. Ещё use after move показывает свои уши в случае когда хочется влепить const, но не можешь, потому как потом хочешь переместить. Но это уже стилистические вопросы. В общем, одна ошибка(?) и куча негативных последствий для языка.
А про 4 рубля — это как посмотреть. Возвращаясь к теме, такой простой код за счёт переаллокаций вектора вызовет N ненужных деструкторов.
std::vector<std::string> res;
for(auto&& word: largeCollection) {
    res.push_back(std::move(word));
}

Оно конечно 4 рубля, но помножить на N.