Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::iostream - как устроен? Кто-нибудь разбирается? 
:(
    Опции темы
Chaos A.D.
Дата 14.8.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



Здраствуйте. Вот блуждал по дебрям стандартной библиотеки GNU ISO C++, в попытке понять устройство потоков ввода-вывода. Добрался до класса ios_base. Был очень удивлен, когда наткнулся на использование обратных вызовов. Так и не смог добраться до истины, как и зачем они там используются. В файле ios_base.h есть объявление следующих функций
void _M_call_callbacks(event __ev) throw();
void _M_dispose_callbacks(void);
void register_callback(event_callback __fn, int __index);

Но их определения я так нигде и не нашел. Так-же загадкой для меня остается назначение многих функций из этого файла, одна из которой -
locale imbue(const locale& __loc);

Где можно найти сырцы с определениями этих функций? Или может они сидят в библиотеках? Для меня so, dll, lib - файлы - это что-то страшное и непонятное, а работа с динамическими библиотеками в Win и *nix-ах - это черная магия. Буду признателен, если кто-нибудь не поленится объяснить, как же все устроено под всеми этими уровнями абстракци в библиотеке ввода-вывода C++. А так же был бы не против получить ссылку на книгу или статью какую-нибудь, с помощью которой я смог бы восполнить пробел в знаниях по библиотечкам...
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
comcon1
Дата 14.8.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Разумеется, не вся STL является статической. Некоторые куски подключаются динамически. Попробуй найти исходник printf() функции stdio.h или qsort() из stdlib.h и многих других - ты не найдешь. Потому что они подключены динамически.

В STL-е статически подключено очень многое, потому что она шаблонная. А шаблоны линкуются на стадии компиляции, следовательно все, что касается шаблонов динамическим быть не может и их исходники лежат прямо у тебя на компе.

В BOOST-е вообще очень много чисто статических библиотек. Легче перечислить обратные примеры: regex, program_options (мне лень в /usr/lib лезть). Пожалуй, больше и не вспомню. Хотя юзался я очень многими.

Для того чтобы найти исходники этих и многих других функций ГУГЛ в руки. Я, помню, почти сразу натыкался на ссылку к исходникам.


--------------------
PM MAIL   Вверх
Mayk
Дата 14.8.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Зачем же гугл? koders.com же есть. Я уж не говорю о всяких .src.rpm пакетах, которые идут вместе с линухом, и в которых следовало бы поискать в первую очередь.
Кстати, забавно, беглый grep по STL от SGI показал, что никаких callback'ов там нет. Ну на то SGI и SGI, я даже не помню когда выкачивал их реализацию
Цитата(Chaos @ 14.8.2005, 18:20)
Где можно найти сырцы с определениями этих функций? Или может они сидят в библиотеках? Для меня so, dll, lib - файлы - это что-то страшное и непонятное, а работа с динамическими библиотеками в Win и *nix-ах - это черная магия

dlopen(3)

Это сообщение отредактировал(а) Mayk - 14.8.2005, 16:55


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
comcon1
Дата 14.8.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Почему же, я вот тока что пробежался по stlport-у и нашел там то, о чем он писал..
А кстати, мне тоже не понятно где в этих исходниках указания на подгрузку дин-библиотек??
-----------
Все - я разобрался. smile последовательным Grep-ованием STL-порта
Функция register_callback объявлена в классе ios_base. Вот его начало:
Код

class _STLP_CLASS_DECLSPEC ios_base {
public: 
// ...

Дальше грепим _STLP_CLASS_DECLSPEC, получаем :
Код

stl/_config.h:#   define  _STLP_CLASS_DECLSPEC  _STLP_CLASS_EXPORT_DECLSPEC
stl/_config.h:#   define  _STLP_CLASS_DECLSPEC  _STLP_CLASS_IMPORT_DECLSPEC

Грепим импорт, находим:
Код

config/stl_gcc.h:#  define _STLP_CLASS_IMPORT_DECLSPEC __attribute__((dllimport))
config/vc_select_lib.h:#   define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
config/stl_bc.h:#  define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
config/stl_bc.h:# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
config/stl_dm.h:#  define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)

Стало немного проясняться. Появились знакомые буквы "dll". Вот дальше куды это уводит я найти не смог. Подскажите, проффи!!


--------------------
PM MAIL   Вверх
Mayk
Дата 14.8.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(comcon1 @ 14.8.2005, 21:32)
Стало немного проясняться. Появились знакомые буквы "dll". Вот дальше куды это уводит я найти не смог. Подскажите, проффи!!

Эээ,я бы попробовал "grep -R register_callback * | less" в корне исходников STLPort(ну или какую реализацию вы там препарируете)
Ну если так не терпится посмотреть исходники этой ф-ции, то идём на koders.com еще раз. Вот тут
register_callback() и другие вкусности лежат.

Это сообщение отредактировал(а) Mayk - 14.8.2005, 17:40


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
comcon1
Дата 14.8.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Дык я так и делал smile.
Точнее так
Код

grep -B 500 -r ...

потому что прояснение в заголовке класса, который сильно выше ;).
Все результаты деланья отражены в посте. А вот макрос __declspec() найти не могу. Он, кстати не только в STL - он во всех местах. Меня интересуют не исходники, а подключение.
Добавлено @ 17:47
Все я нашел: это специальные ключевые слова.
Цитата

Шаг 122 - __declspec

Спецификация Microsoft

Это ключевое слово позволяет установить дополнительные атрибуты в определения. Например, классов или функций. Атрибуты могут быть следующие.

allocate("segname")      // определяет сегмент данных для распределения
dllimport      // экспортируемое из DLL
dllexport      // импортируемое в DLL
naked        // генерация кода без оболочки функций
noreturn      // функция не имеет возврата
nothrow        // в функции не будет исключений
novtable      // у класса не будет виртуальной таблицы
property({get=get_func_name|, put=put_func_name}) // для виртуальных членов в классах т структурах.
selectany      // для оптимизации переменных
thread        // для локальных переменных потока
uuid("ComObjectGUID")      //Компилятор прилагает GUID к классу или структуре

Применение этого ключевого слова требует опыта. Если с импортом, экспортом более менее понятно, то зачем говорить, например что у функции не будет исключений nothrow? Тут надо знать, что если функция может вызвать исключение, то к ней дописывается определенный код. А вот применение этого ключевого слова этот код удаляет. Вроде как функция будет меньше. Или когда виртуальной таблицы нет novtable, то же будет меньше.


Это сообщение отредактировал(а) comcon1 - 14.8.2005, 17:45


--------------------
PM MAIL   Вверх
Chaos A.D.
Дата 17.8.2005, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



Спасибо за помошь. Mayk, спасибо за хорошую ссылку.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.