Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Всем привет! У меня есть класс Person Код: 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. Оператор присваивание не объявлен явно, но я читал, что он все равно создается компилятором. В основном коде я создаю 3 объекта, а потом по одному записываю их в массив. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вот в этой строчке кода, я так понимаю, задействуется конструктор присваивания? Код: plaintext 1. И мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов? Я так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:22 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка char Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай об указателях, на пальцах это трудно объяснять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:30 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка char Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай об указателях, на пальцах это трудно объяснять. Сорри, я путаюсь в том, как правильно сформулировать вопрос. Я имел ввиду что этот указатель указаывает на массив из одной ячейки, и когда после операции присваивания, этот указатель указывает на массив из 5ти ячеек. А что случилось с памятью выделенной под массив из одной ячейки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА что случилось с памятью выделенной под массив из одной ячейки? Что случается с цифрой на часах, когда ты переводишь стрелку, которая на неё указывает? Ничего. Абсолютно ничего. Она по прежнему выделена, но теперь никто не знает где она. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 21:39 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GИ мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов?Нет, кусок памяти в один байт останется существовать, но никто более не знает где он находится поэтому и освободить его уже невозможно. Это потеря памяти в чистом виде. MaximuS_GЯ так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти.Нет, сообщения об ошибке ты не получишь. Деструктор удалит кусок памяти в пять байт, а про однобайтовый кусок все просто забыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:12 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:22 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_G Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Ну точнее, будут пытаться, если вы просто скопируете указатель при присвоении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 22:35 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonMaximuS_G Dimitry Sibiryakov , White Owl Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку. Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз. Не совсем понимаю, почему объекты будут указывать на одну и ту же память? У них у каждого своя. А в конструкторе присваивания я использую метод strcpy, а не буду копировать указатели. Что я упускаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 23:12 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Вот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2013, 23:18 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 00:41 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GВот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:03 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GА в конструкторе присваивания я использую метод strcpy Тогда норм. Просто скопировать не догадываются чаще чем освободить. Копируют указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:48 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
egorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Спасибо за совет! Я даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 01:56 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
не бываетMaximuS_GВот, добавил конструктор присваивания: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:05 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_Gне бываетпропущено... Конструктора присваивания не бывает. Есть: 1. конструктор копирования 2. оператор присваивания Имеют место в следующих случаях: Код: plaintext 1. 2. 3. 4. Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? Да. Везде конструктор копирования. T a = 1; эквивалентно T a(1); T b; T a = b; эквивалентно T a(b); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:09 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
эквивалентноT a = 1; эквивалентно T a(1); Точнее здесь параметризированный конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 02:10 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ?скорее, на такое: Код: plaintext 1. 2. 3. 4. если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 03:09 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
egorychMaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое: Код: plaintext 1. 2. 3. 4. 5. 6. ?скорее, на такое: Код: plaintext 1. 2. 3. 4. если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой. Спасибо большое! Добавил в оператор присваивания :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:15 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
эквивалентноMaximuS_Gпропущено... Спасибо за подсказку! Я вот такой конструкции не встречал T a = 1; Это тоже самое что T a(1) ? Да. Везде конструктор копирования. T a = 1; эквивалентно T a(1); T b; T a = b; эквивалентно T a(b); Я понял, спасибо большое! Вот таким образом Код: plaintext 1. я так понял можно инициализировать объект, если в параметризированном конструкторе один параметр. А если несколько параметров, можно как-то через равно инициализировать объект? Вот так, как со структурой, не получается. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:27 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
И еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример: Рассмотрим простой класс: Код: plaintext 1. 2. 3. 4. 5. 6. При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор: Код: plaintext 1. 2. 3. 4. Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 12:56 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют указатель. Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики ссылок или флаг владельца. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 13:26 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovEdd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют указатель. Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики ссылок или флаг владельца. А в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 16:37 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GИ еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример: Рассмотрим простой класс: Код: plaintext 1. 2. 3. 4. 5. 6. При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор: Код: plaintext 1. 2. 3. 4. Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста. То что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Аналог без класса: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 16:42 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
флаг владельцаА в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок? В моём собственном. Не требует ссылки на структуру. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 18:53 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovфлаг владельцаА в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок? В моём собственном. Не требует ссылки на структуру. А не покажете его, когда там флаг устанавливается и как копирование происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 20:33 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
список инициализацииТо что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Аналог без класса: Код: plaintext 1. 2. Спасибо за комментарий. То есть это можно так инициализировать поля класса с помощью конструктора класса? Не совсем понимаю, зачем это надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:15 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
покажетекогда там флаг устанавливается и как копирование происходит? В copy-конструкторе, натурально. И копирование происходит с помощью оператора присваивания. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:24 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, А зачем нужен этот смартуказатель с флагом владельца? Почему нельзя применить простой указатель когда нет владения, и какой-нибудь unique_ptr для владения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:32 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПочему нельзя применить простой указатель когда нет владения, и какой-нибудь unique_ptr для владения? Затем, что право владения у меня переходящее и мне было проще изобрести собственный велосипед чем ковыряться в STL. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:35 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovправо владения у меня переходящее Мне просто хотелось обеспечить работоспособность кода Код: sql 1. без лишних операций с динамической памятью и копированием её содержимого. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:43 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Допустим (хотя auto_ptr/unique_ptr как раз и реализуют передачу владения - не знаю зачем ковыряться в STL чтобы это узнать). Но наличие обертки над указателем, без гарантии что указатель еще валидный, создает ложное ощущение что управление автоматическое, хотя по сути контроль за валидностью указателя по прежнему лежит на программисте. Т.е. состояние когда флаг владения не установлен - бессмысленно. Сам указатель должен быть таким флагом, а при передаче владения - обнуляться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:48 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDimitry Sibiryakovправо владения у меня переходящее Мне просто хотелось обеспечить работоспособность кода Код: sql 1. без лишних операций с динамической памятью и копированием её содержимого. А где тут могут возникнуть проблемы с динамической памятью? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 21:59 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСам указатель должен быть таким флагом, а при передаче владения - обнуляться. Да, это было бы логично если бы я был уверен, что "старый" экземпляр уже не будет использоваться после создания нового. Возможно, при следующей чистке кода я так и сделаю. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 22:26 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
egorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому ИМХО, согласен в этом плане с товарищем Саттером, который говорит, что наличие таких проверок зачастую озаначает просчет в архитектуре. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. И никаких проверок не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 22:54 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MozokegorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому ИМХО, согласен в этом плане с товарищем Саттером, который говорит, что наличие таких проверок зачастую озаначает просчет в архитектуре. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. И никаких проверок не нужно. Но в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 23:18 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Mozok, Лучше (хоть по сути и то же самое) реализовать метод swap(T&) и тогда оператор копирования (как и swap) будет выглядеть тривиально (а значит менее подвержен ошибкам, в т.ч. из-за дублирования кода конструктора копирования): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Таким образом останется реализовать только конструктор копирования, а не дублировать его логику в оператор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 23:27 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав? Прав. Но присвоение в себя - это ошибка кодирования. В норме ее не должно быть. А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 23:29 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMozok, Лучше (хоть по сути и то же самое) реализовать метод swap(T&) и тогда оператор копирования (как и swap) будет выглядеть тривиально (а значит менее подвержен ошибкам, в т.ч. из-за дублирования кода конструктора копирования): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Таким образом останется реализовать только конструктор копирования, а не дублировать его логику в оператор. Но при изменениях класса придется менять и void swap и конструктор копирования? Либо наоборот :) Код: plaintext 1. 2. 3. 4. Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 23:50 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав? Прав. Но присвоение в себя - это ошибка кодирования. В норме ее не должно быть. А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов. А присвоение в себя в данном случае можно как-то отловить во время компиляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2013, 23:52 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMaximuS_GНо в Вашем случае произойдет копирование данных, а в случае с проверкой - нет. Эти конструкторы по разному реагируют на присваивание одного и того же объекта друг другу. Или я не прав? Прав. Но присвоение в себя - это ошибка кодирования. В норме ее не должно быть. А заниматься оптимизацией кода, который редко исполняется - это пустая трата ресурсов. Тогда я запутался, лучше делать проверку, или нет? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 00:00 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyНо присвоение в себя - это ошибка кодирования. Ой ли? Мания компактного кода заставляет каждого второго писать что-то типа Код: plaintext 1. Но кто сказал, что это ошибка кодирования? Можно долго спорить о философской стороне вопроса. Но практическая сторона однозначно заявляет, что такой код совершенно корректен и не безсмысленен абсолютно, чтобы однозначно назвать его говонокодом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 00:19 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GТогда я запутался, лучше делать проверку, или нет? :) Делайте, делайте. При разработке универсальных контейнеров динамических данных лишняя проверка лишней не бывает. А для глубокой оптимизации сложных алгоритмов, работающих с динамическими данными нужно выбрасывать к чертям все эти универсальные контейнеры и писать велосипеды, реализующие алгоритм и структуры данных строго под задачу. В противном случае хоть с этой проверкой, хоть без нее при интенсивном использовании динамических строк, массивов и производных от них типов столько лишних телодвижений происходит, что эта проверка - капля в море. Но если таким путем достигаются иные выгоды, то и ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 00:26 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonMaximuS_GТогда я запутался, лучше делать проверку, или нет? :) Делайте, делайте. При разработке универсальных контейнеров динамических данных лишняя проверка лишней не бывает. А для глубокой оптимизации сложных алгоритмов, работающих с динамическими данными нужно выбрасывать к чертям все эти универсальные контейнеры и писать велосипеды, реализующие алгоритм и структуры данных строго под задачу. В противном случае хоть с этой проверкой, хоть без нее при интенсивном использовании динамических строк, массивов и производных от них типов столько лишних телодвижений происходит, что эта проверка - капля в море. Но если таким путем достигаются иные выгоды, то и ладно. Ясно, спасибо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 00:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Либо наоборотЛибо наоборот :) Код: plaintext 1. 2. 3. 4. Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его. Нельзя вызывать присвоение для еще несконструированного объекта с мусором в полях. Сначала надо создать валидный эземпляр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 01:12 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Edd.DragonAnatoly MoskovskyНо присвоение в себя - это ошибка кодирования. Ой ли? Мания компактного кода заставляет каждого второго писать что-то типа Код: plaintext 1. А где тут компактность? Если уж компактно записывать то вот так (на 1 символ короче) :) Код: plaintext 1. Но кто сказал, что это ошибка кодирования? Можно долго спорить о философской стороне вопроса. Но практическая сторона однозначно заявляет, что такой код совершенно корректен и не безсмысленен абсолютно, чтобы однозначно назвать его говонокодом. Конечно это говнокод. Именно такой код получается когда стоит задача написать компактно, а не понятно. Конкретно по проверке на присвоение в себя - эту проверку можно делать только для оптимизации. Если без нее код присвоения работает неверно - то это неверная реализация присвоения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 01:24 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЛибо наоборотЛибо наоборот :) Код: plaintext 1. 2. 3. 4. Останется реализовать только оператор = с глубоким копированием. При изменении класса придется менять только его. Нельзя вызывать присвоение для еще несконструированного объекта с мусором в полях. Сначала надо создать валидный эземпляр. Все члены класса к этому моменту проинициализированы дефолтными значениями. За исключением тех у кого нет конструктора без параметров - их придется писать в списке инициализации. А как возможно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 01:50 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
возможно?, Это все возможно в некоторых частных случаях. И будет работать до первого рефакторинга, когда один частный случай перейдет в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 02:03 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyвозможно?, Это все возможно в некоторых частных случаях. И будет работать до первого рефакторинга, когда один частный случай перейдет в другой. Приведите пример когда это не будет работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 02:28 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Приведите примерAnatoly Moskovskyвозможно?, Это все возможно в некоторых частных случаях. И будет работать до первого рефакторинга, когда один частный случай перейдет в другой. Приведите пример когда это не будет работать? Например, почленное копирование из константной ссылки непотокобезопасно, т.к. неатомарно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 03:13 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
А, вы ж просили пример, когда не работает. Вот он: Либо наоборот Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 03:57 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Т.е. тут Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Anatoly Moskovskyвсе возможно в некоторых частных случаях. а тут уже Anatoly Moskovskyне работает: Либо наоборот Код: plaintext 1. 2. 3. 4. Anatoly MoskovskyПриведите примерпропущено... Приведите пример когда это не будет работать? Например, почленное копирование из константной ссылки непотокобезопасно, т.к. неатомарно. Ну так та же самая проблема и в вашем примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 04:17 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
та же самая проблема Т.е. тут все возможно в некоторых частных случаях а тут уже не работает Пример, с *this = from - не работает для реального класса рассмотренного в данном топике, где есть поле Name. А с вашими int конечно будет работать. Но вы же не думаете что вам так всегда будет везти? Ведь пока я вам не указал на необходимость инициализации полей перед вызовом присвоения, вы и не вспомнили об этом, хотя уверен, что знали. Т.е. в реальном проекте когда дело дошло бы до подобного кода, вполне вероятно вы бы тоже забыли. та же самая проблема Anatoly Moskovsky Например, почленное копирование из константной ссылки непотокобезопасно, т.к. неатомарно. Ну так та же самая проблема и в вашем примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А где вы в этом примере видете почленное копирование из внешнего объекта? Или вы предполагаете что я бы криво написал конструктор копирования, который здесь не приведен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 04:34 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyта же самая проблема Т.е. тут все возможно в некоторых частных случаях а тут уже не работает Пример, с *this = from - не работает для реального класса рассмотренного в данном топике, где есть поле Name. А с вашими int конечно будет работать. Но вы же не думаете что вам так всегда будет везти? Ведь пока я вам не указал на необходимость инициализации полей перед вызовом присвоения, вы и не вспомнили об этом, хотя уверен, что знали. Т.е. в реальном проекте когда дело дошло бы до подобного кода, вполне вероятно вы бы тоже забыли. Я же писал, поля инициализируются конструктором по умолчанию сами - помнить не надо. А у кого нет такого конструктора, там компилятор подскажет - тоже помнить не надо. Anatoly Moskovskyта же самая проблемапропущено... Ну так та же самая проблема и в вашем примере: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А где вы в этом примере видете почленное копирование из внешнего объекта? Или вы предполагаете что я бы криво написал конструктор копирования, который здесь не приведен? Нет, это вы предполагаете, что я бы криво написал оператор присваивания, который у меня не приведен. Вы просто читали очень не внимательно и подумали, что я оставлю operator= по умолчанию, по этому у вас и какие-то проблемы с Name, многопоточностью и т.д. Либо наоборот Код: plaintext 1. 2. 3. 4. Останется реализовать только оператор = с глубоким копированием . При изменении класса придется менять только его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 15:01 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
читали очень не внимательноAnatoly Moskovskyпропущено... Пример, с *this = from - не работает для реального класса рассмотренного в данном топике, где есть поле Name. А с вашими int конечно будет работать. Но вы же не думаете что вам так всегда будет везти? Ведь пока я вам не указал на необходимость инициализации полей перед вызовом присвоения, вы и не вспомнили об этом, хотя уверен, что знали. Т.е. в реальном проекте когда дело дошло бы до подобного кода, вполне вероятно вы бы тоже забыли. Я же писал, поля инициализируются конструктором по умолчанию сами - помнить не надо. А у кого нет такого конструктора, там компилятор подскажет - тоже помнить не надо. Поле Name это указатель. У него нет и не может быть никаких конструкторов. При входе в конструктор копирования там мусор, который в вашем операторе присвоения будет рассматриваться как адрес блока памяти который нужно освободить перед установкой нового значения. И никакие известные мне компиляторы ничего не подсказывают в такой ситуации - такой анализ замедлил бы компиляцию, так как предполагает поиск пути в графах. Таким образом, перед вызовом присвоения в к-торе копирования все равно нужно проинициализировать корректно каждое поле, и никакого преимущества в минимизации дублирования перенос логики копирования в оператор= не дает. Зато сложность кода растет, т.к. теперь конструктор и оператор зависят друг от друга. В случае же когда логика находится в к-торе + swap, то только оператор= зависит от к-тора, а метод swap тривиален (он вообще в большинстве случаев может быть реализован как побитный swap всего объекта, без перечисления отдельных полей, а в остальных случаях - просто линейный регулярный код) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 15:27 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
читали очень не внимательноНет, это вы предполагаете, что я бы криво написал оператор присваивания, который у меня не приведен. Вы просто читали очень не внимательно и подумали, что я оставлю operator= по умолчанию, по этому у вас и какие-то проблемы с Name, многопоточностью и т.д. Причем здесь корректность оператора=? Я вам указал на проблему в конкретном коде конструктора, где перед вызовом = копируете два поля из from. Это неатомарное действие, чья неатомарность не зависит от корректности кода =. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 15:33 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Вот тут обсуждаются эти два подхода и их достоинства и недостатки: http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom http://stackoverflow.com/questions/3652103/implementing-the-copy-constructor-in-terms-of-operator Краткое резюме: никаких достоинств у подхода реализующего конструктор копирования через оператор= нет. Зато недостатков полно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 16:35 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyчитали очень не внимательнопропущено... Я же писал, поля инициализируются конструктором по умолчанию сами - помнить не надо. А у кого нет такого конструктора, там компилятор подскажет - тоже помнить не надо. Поле Name это указатель. У него нет и не может быть никаких конструкторов. При входе в конструктор копирования там мусор, который в вашем операторе присвоения будет рассматриваться как адрес блока памяти который нужно освободить перед установкой нового значения. И никакие известные мне компиляторы ничего не подсказывают в такой ситуации - такой анализ замедлил бы компиляцию, так как предполагает поиск пути в графах. Таким образом, перед вызовом присвоения в к-торе копирования все равно нужно проинициализировать корректно каждое поле, и никакого преимущества в минимизации дублирования перенос логики копирования в оператор= не дает. Зато сложность кода растет, т.к. теперь конструктор и оператор зависят друг от друга. В случае же когда логика находится в к-торе + swap, то только оператор= зависит от к-тора, а метод swap тривиален (он вообще в большинстве случаев может быть реализован как побитный swap всего объекта, без перечисления отдельных полей, а в остальных случаях - просто линейный регулярный код) Теперь понятно что вы имели ввиду. Да, в случае динамического выделения памяти никакой пользы от моего подхода не будет. Естественно нужно будет указатели инициализировать NULL. Но в любом случае в operator= делается проверка на NULL перед освобождением памяти и только затем выделение. Хотя, не знаете, по стандарту указатели по умолчанию не инициализируются NULL/null_ptr? Но если это не жизненно необходимо, лучше использовать умные указатели и контейнеры вместо обычных указателей для динамической памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 17:07 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyчитали очень не внимательноНет, это вы предполагаете, что я бы криво написал оператор присваивания, который у меня не приведен. Вы просто читали очень не внимательно и подумали, что я оставлю operator= по умолчанию, по этому у вас и какие-то проблемы с Name, многопоточностью и т.д. Причем здесь корректность оператора=? Я вам указал на проблему в конкретном коде конструктора, где перед вызовом = копируете два поля из from. Это неатомарное действие, чья неатомарность не зависит от корректности кода =. Я привел примеры почленного копирования в конструкторе только, чтобы понять что вы имели ввиду. Естественно предполагалось, что вариант operator= потокобезопасный. Сейчас почитаю что там на stackoverflow пишут. Кстати, std::swap по стандарту атомарный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 17:15 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
умные указатели и контейнерыХотя, не знаете, по стандарту указатели по умолчанию не инициализируются NULL/null_ptr? По умолчанию не инициализируются, как и другие POD-члены без конструкторов. Хотя в некоторых случаях (например когда у контейнера вообще нет пользовательских конструкторов) неявная инициализация членов нулями производится при явной инициализации контейнера через к-тор по умолчанию (T t = T()). Но к конструктору копирования это не относится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 17:42 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
operator= потокобезопасныйКстати, std::swap по стандарту атомарный? Нет. Но это обычно и не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 17:45 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MaximuS_GТогда я запутался, лучше делать проверку, или нет? :) Разве что ассертом, так будет лучше всего. Потому что Anatoly MoskovskyНо присвоение в себя - это ошибка кодирования. В норме ее не должно быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 13:45 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
MozokMaximuS_GТогда я запутался, лучше делать проверку, или нет? :) Разве что ассертом, так будет лучше всего. Потому что Anatoly MoskovskyНо присвоение в себя - это ошибка кодирования. В норме ее не должно быть. А static_assert'ом это можно как-то отловить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 17:06 |
|
||
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#18+
При компиляции нельзя определить. Но я вообще думаю, что это не такая серьезная ошибка, чтобы ее наказывать ассертом. И иногда при несильно продуманной архитектуре (а это почти любая архитектура ) такие ситуации неизбежны Думаю падение скорости достаточное наказание :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 17:20 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2020538]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 304ms |

| 0 / 0 |
