![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
к примеру такой код:
тут все понятно. в объект f сохраняется адрес функции. а теперь такой пример:
вывод:
http://liveworkspace.org/code/cec80337b91f...afaff67ad0d7fb6 в выражении "f = func();" создается временный объект типа нашего функционального объекта. это видно в выводе. потом куча копирующих конструкторов, деструкторов, оператор() нашего объекта, и еще раз деструктор. так но где хранится? внутри f ? Это сообщение отредактировал(а) boostcoder - 3.4.2011, 22:19 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а где ж еще ![]() Добавлено через 37 секунд
вот не куча : http://liveworkspace.org/code/a6355c17dac0...1a87de9db42c506 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
а каким образом они туда сохраняются? т.е. к примеру, наш объект содержит еще и данные, и его sizeof() больше одного. если он таки хранится внутри f, то сначала применяется sizeof() к объекту, потом копирование с помощью memcpy() ? т.е. так все просто? никаких хитростей? это понятно. просто не ожидал что будет столько конструкторов копирования) Добавлено через 7 минут и 39 секунд или в этом случае необходим конструктор копирования? Добавлено через 7 минут и 50 секунд наверное все же да... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
например так : http://liveworkspace.org/code/2d90e4f88ade...38251bc13ce73a9 только в реале более хитрый механизм используют.. Добавлено через 57 секунд memcpy то причем, тем более что вызываются конструкторы.. Добавлено через 1 минуту и 53 секунды у std::function должно быть поменьше.. а у boosta столько из за врапперов.. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ммм..внутри f не значит, что непосредственно включенным в f.. он там просто может не поместится ![]() Добавлено через 1 минуту и 10 секунд еще хитрее, чем я показал ![]() насколько я помню, он использует свою vtable.. а не предоставленную компилятором.. Добавлено через 11 минут и 56 секунд http://www.boost.org/doc/libs/1_46_1/boost...nction_base.hpp обратите внимание на union function_buffer там хранится все.. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот и я об этом..
жуть какая... спасибо. вопрос закрыт. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
более общий вид этого паттерна - type erasure
в частности, он описан здесь: http://www.mr-edd.co.uk/blog/morph_o_matic (правда, там имени этого не упоминается) больше можно найти по "google type erasure c++" -------------------- qqq |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
morph_о_matic и type_erasure имхо разные подходы.. хотя я не очень- в этой теме..
Это сообщение отредактировал(а) mes - 4.4.2011, 15:53 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
хм... может быть а какую разницу видишь? просто я обычно на более-менее мелкие отличия паттернов внимания не обращаю - всё равно на практике всё более размыто, а вот если там есть что-то бОльшее, мне было бы полезно знать -------------------- qqq |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот реализовал два подхода условным кодом ..
надеюсь это объяснит лучше, чем слова : type erasure :
http://liveworkspace.org/code/5a463163cc0b...3317e93b454f704 morph_o_matic :
http://liveworkspace.org/code/4ef038de40ad...ce801599eeaa39b |
||||
|
|||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
если я не ошибаюсь, то они, скорее, отличаются деталями реализации
цель одна - стереть какие-то знания о типе, приведя несколько разных типов к одному -------------------- qqq |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
как по мне, то эта два разных механизма / паттерна, позволяющих придти к одной цели..
цель другая - привязать объект _любого_ типа к нужному интерфейсу.. но в morph_o_matic никакого затирания типа нет.. просто добавляется связывающий адаптер.. а вот в type erasure происходит явное затирание.. Добавлено @ 11:13 детали реализации и есть суть этих паттернов.. ![]() P.S. подправил any (type_erasure) : http://liveworkspace.org/code/2329c3f8c946...9d9bb7596e7e880 Это сообщение отредактировал(а) mes - 7.5.2011, 14:17 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |