Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, сделал попроще: Код: 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. Объявление: Код: plaintext 1. 2. Жаль в C++ нет зарезервированного слова, позволяющего в default подставить <cv-qualifiers type> из объявления lvalue; Модератор: Будете тут какашками кидаться, выпилю обоих из форума. Не только к тебе относится. Асанизация проведена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 12:19 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devВообще, в C++ очень много "недосказанности". К примеру: * Есть возможность "сказать" new const Type(), но нет возможности этот const хоть как-то "услышать" в реализации перегруженного оператора new, конструктора или деструктора класса; * Есть возможность переопределить placement new, но компилятор не симулирует его вызов при определении экземпляра объекта на стеке, хотя, такое поведение было бы логичным; * Можем специализировать шаблоны с дедукцией по параметрам конструктора, но не можем специализировать шаблоны с дедукцией по типу и квалификаторам объявления lvalue; Просто у тебя в голове какой-то другой свой язык, и ты почему-то его называешь "С++"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 13:46 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devblonduser, не дождешься! С дедукцией не получается, а без неё выходит банальный exactly specialized template, который даже школьник напишет. Ну ты всё же сильно переоцениваешь школьников. В массе они даже не знают, что такое специализация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 13:49 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZivrdb_devВообще, в C++ очень много "недосказанности". К примеру: * Есть возможность "сказать" new const Type(), но нет возможности этот const хоть как-то "услышать" в реализации перегруженного оператора new, конструктора или деструктора класса; * Есть возможность переопределить placement new, но компилятор не симулирует его вызов при определении экземпляра объекта на стеке, хотя, такое поведение было бы логичным; * Можем специализировать шаблоны с дедукцией по параметрам конструктора, но не можем специализировать шаблоны с дедукцией по типу и квалификаторам объявления lvalue; Просто у тебя в голове какой-то другой свой язык, и ты почему-то его называешь "С++"...Ты имеешь в виду только последнее замечание или все три? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 15:44 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
Мне было очень интересно увидеть, как и когда ты будешь освобождать те объекты, которые не удалил в деструкторе когда класс был объявлен как "const"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 18:44 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduserМне было очень интересно увидеть, как и когда ты будешь освобождать те объекты, которые не удалил в деструкторе когда класс был объявлен как "const"?Зачем освобождать то, что не выделяется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 00:59 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devЗачем освобождать то, что не выделяется? Это следовало из твоего первого поста и из 21431824 . Обычно делают конструктор с параметрами и уже в зависимости от них либо создают мембер-объект, либо указателю присваивают NULL . В деструкторе очищают те объекты указатель которых не NULL и нет необходимости создавать дополнительные ключи и придумывать шаблоны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 12:09 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduserВ деструкторе очищают те объекты указатель которых не NULL и нет необходимости создавать дополнительные ключи и придумывать шаблоны.Хорошо, поясню на пальцах: допустим, в конструктор передаётся указатель на константную строку из статических ресурсов бинарного модуля и если объект неконстантный, эту строку надо скопировать в кучу и проинициализировать член-указатель на скопированную строку, а если константный, то можно просто проинициализировать указатель на эту константную строку без её копирования. Соответственно, при разрушении неконстантного объекта тебе надо освободить память из под строки, а при разрушении константного объекта этого делать не надо. Так понятнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 12:17 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devblonduserВ деструкторе очищают те объекты указатель которых не NULL и нет необходимости создавать дополнительные ключи и придумывать шаблоны.Хорошо, поясню на пальцах: допустим, в конструктор передаётся указатель на константную строку из статических ресурсов бинарного модуля и если объект неконстантный, эту строку надо скопировать в кучу и проинициализировать член-указатель на скопированную строку, а если константный, то можно просто проинициализировать указатель на эту константную строку без её копирования. Соответственно, при разрушении неконстантного объекта тебе надо освободить память из под строки, а при разрушении константного объекта этого делать не надо. Так понятнее? Код: 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. http://cpp.sh/5aj3m Конструктор понятно как дописать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 12:33 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devХорошо, поясню на пальцах: допустим, в конструктор передаётся указатель на константную строку из статических ресурсов бинарного модуля и если объект неконстантный, эту строку надо скопировать в кучу и проинициализировать член-указатель на скопированную строку, а если константный, то можно просто проинициализировать указатель на эту константную строку без её копирования. Соответственно, при разрушении неконстантного объекта тебе надо освободить память из под строки, а при разрушении константного объекта этого делать не надо. Так понятнее?великолепная мина, с отличным, отложенным запалом )) здесь прекрасно всё))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 12:39 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devдопустим, в конструктор передаётся указатель на константную строку из статических ресурсов бинарного модуля и если объект неконстантный, эту строку надо скопировать в кучу и проинициализировать член-указатель на скопированную строку, а если константный, то можно просто проинициализировать указатель на эту константную строку без её копирования. Соответственно, при разрушении неконстантного объекта тебе надо освободить память из под строки, а при разрушении константного объекта этого делать не надо. Но ты понимаешь, что указатель можно сделать не константным внутри вызова и изменить строку как угодно? Именно для строки я видел шаблон в котором реализован механизм который ты описал. Но там передаются объекты строки, а указатель на строку один. Если в какой-то момент времени строку надо изменить, то создается копия строки. При удалении последнего объекта очищается и строка. Вот такой механизм тебе не подойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 12:55 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
blonduserНо ты понимаешь, что указатель можно сделать не константным внутри вызова и изменить строку как угодно?Если член-указатель private, то это реализация только моя. Например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. blonduserИменно для строки я видел шаблон в котором реализован механизм который ты описал. Но там передаются объекты строки, а указатель на строку один. Если в какой-то момент времени строку надо изменить, то создается копия строки. При удалении последнего объекта очищается и строка.Я уже думал над этим, но так как у меня в структуре не может хранится ничего, кроме одного лишь указателя, придётся сделать static переменную внутри какого-нибудь protected метода, указывающую на экземпляр std::map, который будет дополняться из конструктора (подчищаться из деструктора) и хранить указатели на экземпляры структуры с флагами инициализации, а сам метод будет возвращать состояние инициализации. Но при любой реализации есть одна загвоздка - при вызове CTest("The test message"), короткая строка может быть передана целиком в кадре стека вместе с указателем на неё и, естественно, может быть затёрта кадрами других вызовов после выхода из области видимости. Или же, может быть передан указатель на строку из кучи, а потом память из под этой строки будет освобождена. В итоге получается, что при использовании не очень больших строк, накладные расходы на отлов всех этих нюансов перекрывают выгоды от некопирования строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 13:31 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
egorychвеликолепная мина, с отличным, отложенным запалом )) здесь прекрасно всё)))А то! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 13:32 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
Siemargl, указатель внутри структуры, принципиально, только один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 13:33 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devЯ уже думал над этим, но так как у меня в структуре не может хранится ничего, кроме одного лишь указателя Ну так одного указателя достаточно. Ему можно присвоить всё что угодно главное не забывать что присвоил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 13:53 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 16:56 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devSiemargl, указатель внутри структуры, принципиально, только один.Тогда придется хранить флаг константности инициализации. Но вообще то проще делать копию в любом случае, если только данных не заоблачное кол-во. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 18:06 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
Еще можно использовать constexpr и вынести время жизни объекта вообще на стадию компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2018, 19:12 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devMasterZivпропущено... Просто у тебя в голове какой-то другой свой язык, и ты почему-то его называешь "С++"...Ты имеешь в виду только последнее замечание или все три? Все три. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 11:00 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devblonduserВ деструкторе очищают те объекты указатель которых не NULL и нет необходимости создавать дополнительные ключи и придумывать шаблоны.Хорошо, поясню на пальцах: допустим, в конструктор передаётся указатель на константную строку из статических ресурсов бинарного модуля и если объект неконстантный, эту строку надо скопировать в кучу и проинициализировать член-указатель на скопированную строку, а если константный, то можно просто проинициализировать указатель на эту константную строку без её копирования. Соответственно, при разрушении неконстантного объекта тебе надо освободить память из под строки, а при разрушении константного объекта этого делать не надо. Так понятнее? Твои представления об объектной модели С++ несколько проще, чем она есть на самом деле. Помимо константных и неконстантных объектов есть ещё объекты временные, и семантика перемещения, которая работает и с константными, и с неконстантными, и с временными объектами. Тебе надо ОТДЕЛЬНО, ОРТОГОНАЛЬНО К КОНСТАНТНОСТИ ОБЪЕКТА реализовать эту фичу: твой объект должен хранить либо ссылку на константу либо реальное значение, и знать, на что он ссылается в данный момент. если объект ссылается на константную строку из стат. ресурсов, то работать с ней пока объект не меняется в этом аспекте. если эта строка меняется внутри данного объекта, то менять её на ссылку на константные ресурсы либо на реальное значение. при удалении освобождать что-то только если мы храним реальное значение. И сделать это, кажется, достаточно просто, нужно хранить внутри std::variant< std::string, std::string_view > Я не знаю всю твою семантику, но похоже, что тебе это подойдёт, при этом не нужно делать почти вообще ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 11:20 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZivВсе три.Давай по пунктам? * Есть возможность "сказать" new const Type(), но нет возможности этот const хоть как-то "услышать" в реализации перегруженного оператора new, конструктора или деструктора класса; Зачем возможность писать const, если при создании экземпляра класса в куче этот const, ровным счётом, ни на что не влияет? * Есть возможность переопределить placement new, но компилятор не симулирует его вызов при определении экземпляра объекта на стеке, хотя, такое поведение было бы логичным; При размещении экземпляра класса на стеке компилятор сам выделяет память на стеке и инициализирует там экземпляр класса, что примерно равносильно: Код: plaintext 1. 2. Так почему бы компилятору не создавать placement new по умолчанию, если он не переопределен и не симулировать его вызов? Получили бы более управляемое поведение. * Можем специализировать шаблоны с дедукцией по параметрам конструктора, но не можем специализировать шаблоны с дедукцией по типу и квалификаторам объявления lvalue; Есть же using, которые используются подобно typedef! Так почему бы не предусмотреть в них использование cv-квалификаторов c помощью какой-нибудь подходящей семантики? Что-то типа: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 11:52 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
MasterZivТвои представления об объектной модели С++ несколько проще, чем она есть на самом деле. Помимо константных и неконстантных объектов есть ещё объекты временные, и семантика перемещения, которая работает и с константными, и с неконстантными, и с временными объектами. Тебе надо ОТДЕЛЬНО, ОРТОГОНАЛЬНО К КОНСТАНТНОСТИ ОБЪЕКТА реализовать эту фичу: твой объект должен хранить либо ссылку на константу либо реальное значение, и знать, на что он ссылается в данный момент. если объект ссылается на константную строку из стат. ресурсов, то работать с ней пока объект не меняется в этом аспекте. если эта строка меняется внутри данного объекта, то менять её на ссылку на константные ресурсы либо на реальное значение. при удалении освобождать что-то только если мы храним реальное значение. И сделать это, кажется, достаточно просто, нужно хранить внутри std::variant< std::string, std::string_view > Я не знаю всю твою семантику, но похоже, что тебе это подойдёт, при этом не нужно делать почти вообще ничего. Я, пока что, отказался от мысли реализовать эту бредовую идею прямо сейчас, но для себя решил плясать от обратного - если константное значение находится в памяти модуля процесса и выделенная под него память read-only, то инициализировать без копирования и хранить этот признак в std::map, на который будет указывать статический указатель внутри protected виртуального метода. Просто сейчас лень штудировать MSDN на предмет всех этих плясок вокруг получения информации о страницах памяти модуля, так как сейчас нет крайней необходимости работы с большими строками или блобами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 11:59 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
rdb_devПри размещении экземпляра класса на стеке компилятор сам выделяет память на стеке и инициализирует там экземпляр класса, что примерно равносильно : Код: plaintext 1. 2. Спасибо, поржал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 12:10 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
NekZСпасибо, поржал На , еще поржи! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 12:25 |
|
||
|
Константный экземпляр класса. Кто как делает?
|
|||
|---|---|---|---|
|
#18+
NekZrdb_devПри размещении экземпляра класса на стеке компилятор сам выделяет память на стеке и инициализирует там экземпляр класса, что примерно равносильно ... Спасибо, поржал Или ты мне хочешь рассказать, как компилятор вставляет машинный код, оперирующий регистрами (R/E)SP и (R/E)BP? Не стОит!... Ровно тоже самое делает функция _malloca. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2018, 13:12 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39649863&tid=2017848]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 269ms |
| total: | 427ms |

| 0 / 0 |
