| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > как хранятся объекты привязанные к boost::function |
| Автор: boostcoder 3.4.2011, 21:59 | ||||||
к примеру такой код:
тут все понятно. в объект f сохраняется адрес функции. а теперь такой пример:
вывод:
http://liveworkspace.org/code/cec80337b91f8a48fafaff67ad0d7fb6 в выражении "f = func();" создается временный объект типа нашего функционального объекта. это видно в выводе. потом куча копирующих конструкторов, деструкторов, оператор() нашего объекта, и еще раз деструктор. так но где хранится? внутри f ? |
| Автор: boostcoder 3.4.2011, 22:48 |
а каким образом они туда сохраняются? т.е. к примеру, наш объект содержит еще и данные, и его sizeof() больше одного. если он таки хранится внутри f, то сначала применяется sizeof() к объекту, потом копирование с помощью memcpy() ? т.е. так все просто? никаких хитростей? это понятно. просто не ожидал что будет столько конструкторов копирования) Добавлено через 7 минут и 39 секунд или в этом случае необходим конструктор копирования? Добавлено через 7 минут и 50 секунд наверное все же да... |
| Автор: mes 3.4.2011, 23:08 |
например так : http://liveworkspace.org/code/2d90e4f88adedcfbd38251bc13ce73a9 только в реале более хитрый механизм используют.. Добавлено через 57 секунд memcpy то причем, тем более что вызываются конструкторы.. Добавлено через 1 минуту и 53 секунды у std::function должно быть поменьше.. а у boosta столько из за врапперов.. |
| Автор: boostcoder 3.4.2011, 23:11 |
ужос все таки хитро оно все.. не думал что настолько... |
| Автор: mes 3.4.2011, 23:11 |
ммм..внутри f не значит, что непосредственно включенным в f.. он там просто может не поместится Добавлено через 1 минуту и 10 секунд еще хитрее, чем я показал насколько я помню, он использует свою vtable.. а не предоставленную компилятором.. Добавлено через 11 минут и 56 секунд http://www.boost.org/doc/libs/1_46_1/boost/function/function_base.hpp обратите внимание на union function_buffer там хранится все.. |
| Автор: boostcoder 4.4.2011, 00:31 | ||
вот и я об этом..
жуть какая... спасибо. вопрос закрыт. |
| Автор: maxim1000 4.4.2011, 09:08 |
| более общий вид этого паттерна - type erasure в частности, он описан здесь: http://www.mr-edd.co.uk/blog/morph_o_matic (правда, там имени этого не упоминается) больше можно найти по "google type erasure c++" |
| Автор: mes 4.4.2011, 15:52 |
| morph_о_matic и type_erasure имхо разные подходы.. хотя я не очень- в этой теме.. |
| Автор: maxim1000 4.4.2011, 21:28 |
хм... может быть а какую разницу видишь? просто я обычно на более-менее мелкие отличия паттернов внимания не обращаю - всё равно на практике всё более размыто, а вот если там есть что-то бОльшее, мне было бы полезно знать |
| Автор: mes 4.4.2011, 22:15 |
хм.. надо подумать как высказать.. |
| Автор: mes 4.4.2011, 22:57 | ||||
| вот реализовал два подхода условным кодом .. надеюсь это объяснит лучше, чем слова : type erasure :
http://liveworkspace.org/code/5a463163cc0b94f9e3317e93b454f704 morph_o_matic :
http://liveworkspace.org/code/4ef038de40ad65c3fce801599eeaa39b |
| Автор: maxim1000 5.4.2011, 09:45 |
| если я не ошибаюсь, то они, скорее, отличаются деталями реализации цель одна - стереть какие-то знания о типе, приведя несколько разных типов к одному |
| Автор: mes 5.4.2011, 10:59 | ||||
как по мне, то эта два разных механизма / паттерна, позволяющих придти к одной цели..
цель другая - привязать объект _любого_ типа к нужному интерфейсу.. но в morph_o_matic никакого затирания типа нет.. просто добавляется связывающий адаптер.. а вот в type erasure происходит явное затирание.. Добавлено @ 11:13 детали реализации и есть суть этих паттернов.. P.S. подправил any (type_erasure) : http://liveworkspace.org/code/2329c3f8c946f64509d9bb7596e7e880 |