Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Уважаемые эксперты, подскажите почему такой код выводит 10 Хотя должен выводить 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 22:32 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
И еще вопрос t tt{}; t tt1{}; Эти два объекта были созданы на стеке Как только мы вышли из метода - к чему мы вообще обращаемся итерируясь по вектору ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 22:34 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Все я понял причину проблемы Вопрос снят Замена на t *tt = new t(); t *tt1 = new t(); s.emplace_back(tt); s.emplace_back(tt1); решила проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 22:35 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Еще вопрос std::vector<t> getVector() { std::vector<t> s{}; t *tt = new t(); t *tt1 = new t(); s.push_back(*tt); s.push_back(*tt1); -- почему на этой точке возникает вызов деструктора класса t ? return s; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 23:32 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semenЕще вопрос std::vector<t> getVector() { std::vector<t> s{}; t *tt = new t(); t *tt1 = new t(); s.push_back(*tt); s.push_back(*tt1); -- почему на этой точке возникает вызов деструктора класса t ? return s; }Потому что вектор расширяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2018, 23:51 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semenИ еще вопрос t tt{}; t tt1{}; Эти два объекта были созданы на стеке Как только мы вышли из метода - к чему мы вообще обращаемся итерируясь по вектору ? К мусору. Не надо использовать указатели лишний раз, если STL и нет понимания. Но в целом,нужно проучить понятия времени жизни объектов и точки их создания и удаления. Иначе код будет неоптимальным из-за созданий/копирований штучных объектов. Раз этак в несколько медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 00:16 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semenВсе я понял причину проблемы Вопрос снят Замена на t *tt = new t(); t *tt1 = new t(); s.emplace_back(tt); s.emplace_back(tt1); решила проблемуЗато добавила утечку памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 00:18 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semen Код: plaintext 1. 2. 3. 4. если делать так, надо после использования почистить память, которую выделила функция new а именно: пробежаться по вектору и удалить все его элементы Код: plaintext 1. 2. 3. если не хочется удалять память вручную (лучше никогда этого вручную не делать) надо везде t* заменить на shared_ptr<t>, а tt = new t(); заменить на tt = make_shared<t>(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 05:19 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semen Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Уважаемые эксперты, подскажите почему такой код выводит 10 Хотя должен выводить 11. вообще то код ничего не должен, может выводить все, что угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 08:43 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semenИ еще вопрос t tt{}; t tt1{}; Эти два объекта были созданы на стеке Как только мы вышли из метода - к чему мы вообще обращаемся итерируясь по вектору ? вот именно, что ни к чему. к мусору. к тени отца Гамлета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 08:44 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semenЕще вопрос std::vector<t> getVector() { std::vector<t> s{}; t *tt = new t(); t *tt1 = new t(); s.push_back(*tt); s.push_back(*tt1); -- почему на этой точке возникает вызов деструктора класса t ? return s; } не возникает. код тоже неправильный, если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 08:47 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
MasterZivsemen.s.semenЕще вопрос std::vector<t> getVector() { std::vector<t> s{}; t *tt = new t(); t *tt1 = new t(); s.push_back(*tt); s.push_back(*tt1); -- почему на этой точке возникает вызов деструктора класса t ? return s; } не возникает. Как кацегорично https://wandbox.org/permlink/DXb0QP66YmWi8NNp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 09:57 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
a guestMasterZivпропущено... не возникает. Как кацегорично https://wandbox.org/permlink/DXb0QP66YmWi8NNp Там на 5 объектов 3 вызова диструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 10:08 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Для понимания того, о чем говорит a guest, поставьте Код: plaintext 1. перед первым push_back. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 11:07 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Dima Ta guestпропущено... Как кацегорично https://wandbox.org/permlink/DXb0QP66YmWi8NNp Там на 5 объектов 3 вызова диструктора. и будет их все больше и больше по мере роста вектора. Как правильно ответил a guest происходит реаллокация вектора. использование reserve избавит от "лишних" обьектов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2018, 11:09 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
OoCcи будет их все больше и больше по мере роста вектора. Как правильно ответил a guest происходит реаллокация вектора. использование reserve избавит от "лишних" обьектов Или можно сделать noexcept move-конструктор. Именно такой будет вызываться при реаллокации вектора, если существует, взамен конструктору копирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 09:19 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZOoCcи будет их все больше и больше по мере роста вектора. Как правильно ответил a guest происходит реаллокация вектора. использование reserve избавит от "лишних" обьектов Или можно сделать noexcept move-конструктор. Именно такой будет вызываться при реаллокации вектора, если существует, взамен конструктору копирования. Нет. Это нехорошо. В большинстве случаев замена конструктора копирования на конструктор перемещения большой выгоды не даёт. Реаллокэйшн нужно исключать. Иначе этот контэйнер работает в а-ля-джава режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 16:37 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
OoCcНет. Это нехорошо. В большинстве случаев замена конструктора копирования на конструктор перемещения большой выгоды не даёт . Реаллокэйшн нужно исключать. Иначе этот контэйнер работает в а-ля-джава режиме. Лолшлто? Про замену одного конструктора другим никто не говорил. Именно move-семантика позволяет избежать копирования при вынужденном реаллокейшне. Разумеется, когда ты знаешь приблизительное или точное количество элементов нужно использовать reserve. Но, вектор так спроектирован чтобы расширяться, вынуждено перемещая объекты в новую область памяти, когда упирается в размер выделенного блока. Так что, когда есть возможность организовать move-конструктор и оператор присваивания для элементов в векторе -- лучше всего воспользоваться этой возможностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 17:24 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZИменно move-семантика позволяет избежать копирования при вынужденном реаллокейшне. Можно поподробнее. Не силен в современном С++. В С++ нет реаллокейшена, т.е. realloc() не используется. Увеличение размера вектора это как минимум memcpy(), если при этом пресечь вызовы деструкторов и конструкторов, то можно на этом время сэкономить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 18:56 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Похоже, чуваку нужен простой контейнер с указателями. Думаю, нужным ему ответом будет unique_ptr: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 18:59 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
semen.s.semen, если ты не в курсе, то в скобках для unique_ptr<CSome> указываются параметры как для конструктора SCome, т.е. если у тебя конструктор выглядит CSome(5), то и указатель надо создавать как make_unique<CSome>(5). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 19:06 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
Dima TМожно поподробнее. Не силен в современном С++. В С++ нет реаллокейшена, т.е. realloc() не используется. Реаллокейшн не значил вызов realloc'а. Это просто удобный термин обозначающий определённую последовательность действий в реализации std::vector'а. Например, в док референсе употребляется термин "Reallocation". Не суть, в общем. Dima TУвеличение размера вектора это как минимум memcpy(), если при этом пресечь вызовы деструкторов и конструкторов, то можно на этом время сэкономить. memcpy смотря для чего. Для POD-типов memcpy -- вполне себе решение. А вот для комплексных типов классов и структур не всё так просто. Хотя бы потому что у объекта в векторе тогда вообще не будет возможности хоть как-то уведомить внешний мир, что он-то оказывается переехал по новому адресу. Ну или хотя бы потому что внутри объекта могут быть сохранены указатели на внутренние поля (why not?), что сделает их невалидными после копирования в новое место. Вообще, ЕМНИП нет никаких гарантий, что memcpy'ed объект будет работать валидно, ибо это Implementation Defined. Поэтому по классике старых плюсов, вызываются copy-ctor'ы на только что выделенном куске памяти через placement new и затем деструкторы. Понятно, что по задумке конструктор копирования создаёт копию объекта, в то время как move-ctor просто меняет владение внутренними ресурсами объекта. Советую глянуть это короткое видео от Джейсона Тёрнера, который на наглядном примере объясняет как это работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 20:51 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZOoCcНет. Это нехорошо. В большинстве случаев замена конструктора копирования на конструктор перемещения большой выгоды не даёт . Реаллокэйшн нужно исключать. Иначе этот контэйнер работает в а-ля-джава режиме. Лолшлто? Про замену одного конструктора другим никто не говорил. Именно move-семантика позволяет избежать копирования при вынужденном реаллокейшне. Разумеется, когда ты знаешь приблизительное или точное количество элементов нужно использовать reserve. Но, вектор так спроектирован чтобы расширяться, вынуждено перемещая объекты в новую область памяти, когда упирается в размер выделенного блока. Так что, когда есть возможность организовать move-конструктор и оператор присваивания для элементов в векторе -- лучше всего воспользоваться этой возможностью. Лолто. А move семантика это что за зверь? Это и есть замена конструкторов копирования на конструкторы перемещения при реаллокации вектора. Дальше читаем снова моё предыдущее сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2018, 23:39 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZНо, вектор так спроектирован чтобы расширяться, вынуждено перемещая объекты в новую область памяти, когда упирается в размер выделенного блока. Так что, когда есть возможность организовать move-конструктор и оператор присваивания для элементов в векторе -- лучше всего воспользоваться этой возможностью. Глупости. в 99% случаях замена вектора на декъю решает все проблемы с внутренними перемещениями и лишними обьектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2018, 00:12 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
OoCcА move семантика это что за зверь? RTFM OoCcЭто и есть замена конструкторов копирования на конструкторы перемещения при реаллокации вектора. Дальше читаем снова моё предыдущее сообщение. Да нету никакой замены. Конструкторы копирования и перемещения могут сосуществовать в одном классе легко. Вектор при реаллокации смотрит через type_traits есть ли у T noexcept move-конструктор и использует его. Если его нет, он будет использовать copy-конструктор. Если и его нет, попытается найти обычный move-констуктор. Если его нет, то ничего не скомпилируется. Читаем сначала раздел Exceptions/(since C++11) . Дальше подкрепляем матчасть видео из моего предыдущего сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2018, 08:37 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39637064&tid=2017868]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 325ms |
| total: | 470ms |

| 0 / 0 |
