Где сейчас используют void*?
От: LaptevVV Россия  
Дата: 29.04.08 10:00
Оценка:
Вот такой интересный вопрос.
Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,
и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

Желательно в клонах винды.



29.05.08 11:29: Перенесено модератором из 'Прочее' — Хитрик Денис
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Где сейчас используют void*?
От: Anpek  
Дата: 29.04.08 10:04
Оценка:
Здравствуйте, LaptevVV, Вы писали:

Я, например, когда то давно придумал прятать от пользователей моих библиотек под void* все что мне надо. То есть экспортируется из библиотеки класс с какими-то методами, а поля класса я не хочу показывать пользовтаелю, вот и прячу их под void* — что-то типа HWND

Может криво кончно, но я ничего больше не придумал
Re[2]: Где сейчас используют void*?
От: Cruser Украина  
Дата: 29.04.08 10:27
Оценка:
Здравствуйте, Anpek, Вы писали:

A>Здравствуйте, LaptevVV, Вы писали:


A>Я, например, когда то давно придумал прятать от пользователей моих библиотек под void* все что мне надо. То есть экспортируется из библиотеки класс с какими-то методами, а поля класса я не хочу показывать пользовтаелю, вот и прячу их под void* — что-то типа HWND


A>Может криво кончно, но я ничего больше не придумал


Вместо void* лучше имена давать:

В .h файле:

typedef struct MyHandle* MyHandle_t;

В cpp:

typedef struct MyHandle
{

};
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re: Где сейчас используют void*?
От: Кодт Россия  
Дата: 29.04.08 12:26
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,

LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

В голом си? Всякие там qsort, например...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Где сейчас используют void*?
От: LaptevVV Россия  
Дата: 30.04.08 04:49
Оценка:
Здравствуйте, Кодт, Вы писали:

LVV>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,

LVV>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

К>В голом си? Всякие там qsort, например...

Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста.
Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++.
Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Где сейчас используют void*?
От: Кодт Россия  
Дата: 30.04.08 08:41
Оценка: 42 (5)
Здравствуйте, LaptevVV, Вы писали:

К>>В голом си? Всякие там qsort, например...

LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста.
LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++.
LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?

Дело не в ограничениях по памяти.

1. Есть embedding и binding C++ного кода с различными чужеродными рантаймами. С питоном там всяким... да даже с WinAPI.
Попытка написать на С++ callback-функцию для передачи наружу, или наоборот, интерфейс, принимающий callback-функцию извне, — так или иначе выведет на использование обезличенных аргументов.
Тут есть 3 варианта:
— честно объявить, что тип аргумента — intptr_t
— void* и void const* — здесь мы сами себе накладываем доп.ограничения, а заодно снимаем искушение пользоваться арифметикой (intptr_t — это всё-таки целое)
— именованные типы хэндлов, двоично совместимые с void*/intptr_t

Что о нас подумает противоположная сторона — нам пофиг, хотя бы потому, что наружу мы выставляем тоже обезличенный интерфейс (extern "C"), который приводится к тамошней системе типов. Скажем, в VB все винапишные заголовки вместо HWND используют LongInt.


2. Полиморфизм в С++ делается 3 способами:
— интрузивно, в духе ООП (на виртуальных функциях)
— неинтрузивно, на хэндлах и колбеках
— опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать.

Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns".
И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си).

Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное".


3. Программист может всю жизнь пребывать в узких рамках того фреймворка, с которым он привык иметь дело. Дали ему COM — будет всё на COM. Дали boost::function — тоже довлеет.
Зачем знать обо всяких низкоуровневых штуках?
Во-первых, для кругозора.
Во-вторых, чтоб не быть внезапно ошарашенным, когда наткнётся на void* или strcpy в чьих-то исходниках.
Покуда в С++ есть доступ к подвалу, знать об устройстве подвала полезно.
Другое дело, что одним лишь подвалом исчерпывать учебник нельзя.

Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: Где сейчас используют void*?
От: LaptevVV Россия  
Дата: 30.04.08 09:01
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Дело не в ограничениях по памяти.

К>1. Есть embedding и binding C++ного кода с различными чужеродными рантаймами. С питоном там всяким... да даже с WinAPI.
К>Попытка написать на С++ callback-функцию для передачи наружу, или наоборот, интерфейс, принимающий callback-функцию извне, — так или иначе выведет на использование обезличенных аргументов.
К>Тут есть 3 варианта:
К>- честно объявить, что тип аргумента — intptr_t
К>- void* и void const* — здесь мы сами себе накладываем доп.ограничения, а заодно снимаем искушение пользоваться арифметикой (intptr_t — это всё-таки целое)
К>- именованные типы хэндлов, двоично совместимые с void*/intptr_t

К>Что о нас подумает противоположная сторона — нам пофиг, хотя бы потому, что наружу мы выставляем тоже обезличенный интерфейс (extern "C"), который приводится к тамошней системе типов. Скажем, в VB все винапишные заголовки вместо HWND используют LongInt.

Итак, первое — использование С++ в "чужих" системах. Когда либо нельзя написать на родном языке, либо это будет очень медленно.
Хотя даже и в родных "водах" типа WinAPI — тоже. Посмотрю внимательно в эту сторону.

К>2. Полиморфизм в С++ делается 3 способами:

К>- интрузивно, в духе ООП (на виртуальных функциях)
К>- неинтрузивно, на хэндлах и колбеках
К>- опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать.
К>Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns".
К>И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си).
К>Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное".
Вот пункт 2 как раз и вызывает отторжение... Считает, что в учебном пособии не место о таком старом подходе рассказывать.

К>3. Программист может всю жизнь пребывать в узких рамках того фреймворка, с которым он привык иметь дело. Дали ему COM — будет всё на COM. Дали boost::function — тоже довлеет.

К>Зачем знать обо всяких низкоуровневых штуках?
К>Во-первых, для кругозора.
К>Во-вторых, чтоб не быть внезапно ошарашенным, когда наткнётся на void* или strcpy в чьих-то исходниках.
К>Покуда в С++ есть доступ к подвалу, знать об устройстве подвала полезно.
К>Другое дело, что одним лишь подвалом исчерпывать учебник нельзя.
Вот за напоминание о COM — спасибо. Там жеж как раз все через указатели и делается...
К>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...
Эта книжка будет потолще книжки Бертрана Мейера...
Если писать не поверхностно, а всерьез...
Думаю, если всерьез писать, то по каждой теме можно накатать объем типа новых Компиляторов...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Где сейчас используют void*?
От: migel  
Дата: 30.04.08 09:15
Оценка: 1 (1)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, LaptevVV, Вы писали:


К>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...

ммм "... дык ктожь ему дасть... " (с)
IMHO это будет странная помесь фундаментальщины с прикладным закидоном.
Логичнее было бы построить курс "C++ applied" в котором бы объяснялись прикладные вещи с упором на технику применения конкретного языка.
Естественно курс должен идти параллельно с "computer Science" тогда, по моему, практика подтверждала бы теорию.
... << RSDN@Home 1.2.0 alpha rev. 719>>
Re[5]: Где сейчас используют void*?
От: Кодт Россия  
Дата: 30.04.08 09:38
Оценка: +1 :)
Здравствуйте, LaptevVV, Вы писали:

К>>2. Полиморфизм в С++ делается 3 способами:

К>>- интрузивно, в духе ООП (на виртуальных функциях)
К>>- неинтрузивно, на хэндлах и колбеках
К>>- опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать.
К>>Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns".
К>>И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си).
К>>Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное".
LVV>Вот пункт 2 как раз и вызывает отторжение... Считает, что в учебном пособии не место о таком старом подходе рассказывать.

Что она называет "старым подходом"?

Есть две (парадигмы) — мир объектов и мир функций, интрузивные и неинтрузивные политики чего бы то ни было.
Полиморфизм в стиле ООП — пресловутое Королевство Имён. У этого подхода есть ряд недостатков (прежде всего, синтаксический оверхед, навязанный пользователю).
Полиморфизм в стиле ФП — на С++ на уровне языка по-человечески не поддерживается, приходится сперва спуститься в подвал и реализовать его, а потом уже пользоваться высокоуровневыми строго типизированными средствами. Это тоже оверхед, но уже запиханный внутрь библиотеки.

Если читателю учебника неинтересно устройство boost::function, то можно и не писать об устройстве.


К>>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...

LVV>Эта книжка будет потолще книжки Бертрана Мейера...
LVV>Если писать не поверхностно, а всерьез...
LVV>Думаю, если всерьез писать, то по каждой теме можно накатать объем типа новых Компиляторов...

Вчера нашёл на книжной полке ORLY'вский учебник по Питону. Этим талмудом можно человека убить. И тоже с пониманием, что всё-всё-всё охватить не удалось
Там, правда, четверть книги — это секс с Tk, и ещё четверть — секс с CGI. Можно было бы и подсократить...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Где сейчас используют void*?
От: TarasCo  
Дата: 30.04.08 11:42
Оценка:
Я слышал, что void* скрывается на одной заброшенной планете, сплошь покрытой болотами...
Да пребудет с тобою сила
Re: Где сейчас используют void*?
От: 0xDEADBEEF Ниоткуда  
Дата: 30.04.08 12:11
Оценка: 1 (1)
Здравствуйте, LaptevVV, Вы писали:

LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,

ну... STL нельзя использовать там, где не поддерживаются исключения. Например, в драйверописании.
Точнее и там можно, но очень и очень осторожно — по этому поводу даже статья где-то на сайте мелкософта была.

LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

Первый пришедший на ум пример — каноническая реализация COM-овского QueryInterface:
HRESULT QueryInterface(REFIID riid, void **ppvObject);
__________
16.There is no cause so right that one cannot find a fool following it.
Re: Где сейчас используют void*?
От: StevenIvanov США  
Дата: 29.05.08 11:13
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Вот такой интересный вопрос.

LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,
LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

ну еще как пример — написание внутренностей своего менеджера памяти в виде malloc/free-like функций (только не надо говорить, что стандартный и так очень быстр). Естественно будет использован тип void *. Почему malloc возвращает void*, думаю вы и так знаете.
Re[3]: Где сейчас используют void*?
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.05.08 11:14
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Кодт, Вы писали:


LVV>>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,

LVV>>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

К>>В голом си? Всякие там qsort, например...

LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста.
LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++.
LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?

1) Низкоуровневые драйвера. В kernel mode — проблематично с памятью и скорость должна быть очень высокой.
2) Программирование микроконтроллеров. Не для всех микроконтроллеров существуют компиляторы реализующие все функции языка, про стандартные библиотеки я вообще молчу.
3) Мобильные девайсы. Возможно сейчас не актуально, но на заре, скажем для Palm`ов, стандартная библиотека C++ в частности, да и поддержка шаблонов в компиляторе вообще, либо не были толком реализованы, либо были реализованы очень плохо, либо приводили к таким накладным расходам по памяти, что пользоваться было нельзя или приходилось использовать очень осторожно и ограниченно (могло даже не компилироваться, потому что бинарь вылезал за пределы сегмента).
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[6]: Где сейчас используют void*?
От: Lorenzo_LAMAS  
Дата: 29.05.08 13:41
Оценка:
К>Вчера нашёл на книжной полке ORLY'вский учебник по Питону. Этим талмудом можно человека убить. И тоже с пониманием, что всё-всё-всё охватить не удалось
К>Там, правда, четверть книги — это секс с Tk, и ещё четверть — секс с CGI. Можно было бы и подсократить...

Если я правильно понял, что за книга, то она и весит, в англ. издании килограмма 3
Of course, the code must be complete enough to compile and link.
Re[3]: Где сейчас используют void*?
От: _Jane_ Украина  
Дата: 29.05.08 14:56
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Кодт, Вы писали:


LVV>>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,

LVV>>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.

К>>В голом си? Всякие там qsort, например...

LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста.
LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++.
LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?

Убедительные примеры действительно нужны. А также примеры, где так делать не следует. А то вот мою теперешнюю группу научили — и теперь в любом, даже самом что ни на есть объектно-ориентированном коде с STL начинают такие вещи всплывать.
Jane
Re: Где сейчас используют void*?
От: Uzumaki Naruto Ниоткуда  
Дата: 29.05.08 17:51
Оценка: -1
Везде, где тип не важен — выделение памяти, указатели на адрес функции, возвращаемый тип не определен.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.