Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
что делает оператов присваивания в моем коде?
|
|||
|---|---|---|---|
|
#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?fid=57&msg=38100090&tid=2020538]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
208ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 307ms |
| total: | 607ms |

| 0 / 0 |
