|
|
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Вопрос к людям знающим внутреннюю реализацию std::fstream На платформе виндовс. Является ли fstream оберткой над Win32? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 17:03 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Конечно, да. Не лезет же он на диск читать сектора ? А значит, все, что имеет дело с системными вызовами Win32 так или иначе является оберткой для Win32. Irving Washington ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 20:10 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего вызовы <stdio.h>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 20:45 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
>Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего вызовы <stdio.h>. попробую угадать. если реч идет о stdio.h, то там скорее всего обернуты вызова DOS на ассемблере. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 21:19 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
rodb >Я имел в виду, что прямых вызовов WIN32 API там нет. Там скорее всего вызовы <stdio.h>. попробую угадать. если реч идет о stdio.h, то там скорее всего обернуты вызова DOS на ассемблере. Какие вызовы ДОС?!!! Не порти мне настроение такими ужасами. На win32 в конце концов дело конечно же упирается в CreateFile()/ReadFile()/WriteFile() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2006, 22:57 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Сергей Ильич > На win32 в конце концов дело конечно же упирается в CreateFile()/ReadFile()/WriteFile() А вы можете показать кусочек реализации fstream << записи в поток. Я чего-то совсем потерялся, перерыл BCB-ные StlPort заголовки, но до реализации так и не добрался. в cpp файлах ничего не нашел, да их там не так много. Вся реализация убрана кудато -неизвестно куда. Если напрягаю - то Пожалуста. Дмитрий. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:08 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Она убрана в C Runtime Library. Что там показывать ? Там вызовы функций из stdio.h или вызовы функций, реализующих в C Runtime Library функции из stdio.h. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:17 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
rodb Сергей Ильич > На win32 в конце концов дело конечно же упирается в CreateFile()/ReadFile()/WriteFile() А вы можете показать кусочек реализации fstream << записи в поток. Если посмотреть fstream.cpp, в stlport, то можно увидеть что он пользуется либо вызовами POSIX типа _open()/_read()/_write(), либо вызовами Win32 типа CreateFile()/ReadFile()/WriteFile(). Это зависит от платформы. Буферизованный ввод-вывод из stdio.h использовать нет смысла - лучше использовать блочные функции ввода-вывода вместе с буфферами имплементированными на С++. StlPort так и делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 13:10 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Одним словом, можно ли утверждать следующее: На платформе виндовс, использование STL является оберткой над Win32 функциями, доступа к объектам ядра(файлам). На платформе виндовс, будет оптимальнее доступ к файлам при использовании прямых вызовов типа CreateFile()/ReadFile()/WriteFile(). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 14:53 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
rodb Одним словом, можно ли утверждать следующее: На платформе виндовс, использование STL является оберткой над Win32 функциями, доступа к объектам ядра(файлам). На платформе виндовс, будет оптимальнее доступ к файлам при использовании прямых вызовов типа CreateFile()/ReadFile()/WriteFile(). Что такое "оптимальнее"? Все равно 99 процентов времени съест операция ввода-вывода. И как ты объект в файл запишешь? Взять адрес+длину и передать в WriteFile - это неправильно. Писать кусочками по несколько байт (каждое поле отдельно) - тоже неправильно. Правильно скормить все атомарные поля класса в std::ostream, а составным полям этот std::ostream рекурсивно передать чтобы они сделали тоже самое. std::ostream все это дело буферизует и запишет на диск блоками по несколько килобайт. На win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 16:28 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
rodbОдним словом, можно ли утверждать следующее: На платформе виндовс, использование STL является оберткой над Win32 функциями, доступа к объектам ядра(файлам). Более того, любая библиотека будет являться оберткой над Win32 функциями :) Ты в принципе, не сможешь на Win32 платформе писать что-либо и не использовать Win32 функции. В зависимости от библиотеки может быть больше или меньше собственных промежуточных вызовов, но в итоге все обязательно сведется к вызову Win32 функций. rodbНа платформе виндовс, будет оптимальнее доступ к файлам при использовании прямых вызовов типа CreateFile()/ReadFile()/WriteFile().Смотря что считать за оптимум. Если ты сам будешь звать Win32 API, то получишь более полный контроль над файлами. Но потеряешь в переносимости кода. Например: Если у тебя есть некий класс UniversalImage имеющий методы SaveAsJPG(), SaveAsBMP() и так далее. Вызывая эти методы в прикладной программе ты вызываешь кучу библиотечного, уже существующего, кода который сконвертирует картинку в соотвествующий формат и через CreateFile()/WriteFile() запишет ее на диск, но во время записи этот файл будет перезаписан вместо существующего. А тебе например хочется чтобы записываемая картинка добавлялась к концу существующего файла (ты делаешь библиотеку картинок). Вот тогда тебе прийдется искать в классе (или писать самому) методы UniversalImage.CompressToJPGInMemory(), UniversalImage.CompressToBMPInMemory() а потом вручную через CreateFile()/WriteFile() дозаписывать в создающуюся библиотеку картинок. Сергей ИльичНа win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно.Это, мягко сказать - неверно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 18:24 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
White OwlНапример: Если у тебя есть некий класс UniversalImage имеющий методы SaveAsJPG(), SaveAsBMP() и так далее. Вызывая эти методы в прикладной программе ты вызываешь кучу библиотечного, уже существующего, кода который сконвертирует картинку в соотвествующий формат и через CreateFile()/WriteFile() запишет ее на диск, но во время записи этот файл будет перезаписан вместо существующего. А тебе например хочется чтобы записываемая картинка добавлялась к концу существующего файла (ты делаешь библиотеку картинок). Вот тогда тебе прийдется искать в классе (или писать самому) методы UniversalImage.CompressToJPGInMemory(), UniversalImage.CompressToBMPInMemory() а потом вручную через CreateFile()/WriteFile() дозаписывать в создающуюся библиотеку картинок. Если библиотечный метод объявлен так: Код: plaintext 1. White Owl Сергей ИльичНа win32 обычно применяются технологии специфичные для windows типа COM (IPersistFile итд), чтобы приложение интегрировалось в среду более плотно.Это, мягко сказать - неверно :) Я, конечно, имею в виду профессионально написанный софт. Если UniversalImage - COM класс, то метод сохранения в файл должен выглядеть так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 19:14 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
Сергей ИльичЕсли библиотечный метод объявлен так: Код: plaintext 1. Если самому использовать CreateFile()/WriteFile() с явно задаными флагами, то можно это объявить хоть классом потомком ostream (этакий MyCoolFStream), хоть набором процедур работающих с буффером в памяти. Все равно в итоге ты получишь более полное управление файлами, с доступом ко всем возможностям предоставляемым ОС. Это будет чуть сложнее в реализации и возможно менее эффективно по скорости работы, но у тебя будет больше возможностей управлять файлом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 21:15 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
MeЕсли библиотечный метод объявлен так: Код: plaintext 1. Тут конечно же ошибка - const явно лишний. White Owl Это в данном случае не важно. Все равно в стандартном потомке ostream (который fstream) где-то далеко в глубине есть вызовы CreateFile()/WriteFile() с какими-то флагами выставленными по умолчанию. Во первых не далеко в глубине, там один доп. уровень - буферизация. Во вторых в подавляющем большинстве случаев дефолтовых флагов хватает, тем более что шаринг SGI iostreams настраивают. White Owl Если самому использовать CreateFile()/WriteFile() с явно задаными флагами, то можно это объявить хоть классом потомком ostream (этакий MyCoolFStream), хоть набором процедур работающих с буффером в памяти. Это я не понял. Я писал, что пишущим функциям надо передавать абстрактный поток, чтобы гибко управлять процессом. В Java можно нанизывать потоки один на другой - можно например нанизать ZipOutputStream на Base64OutputStream, а его в свою очередь на ByteArrayOutputStream чтобы получить в памяти позипованный и закодированный base64 документ или передать его в сеть через поток который предоставил URLConnection. Причем пишущий код совсем ничего не знает про то что происходит с тем что он пишет - трансформации определяет пользователь кода. Память и CPU тоже не забиваются - все преобразования происходят по мере поступления данных в поток. В С++ так можно делать через iostreams или COM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 22:53 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
А входит ли в понятие Win32 использование NTDLL.DLL для доступа к файлам? по моим данным, длл-ки Win32 импользуют NTDLL.DLL Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:11 |
|
||
|
знатокам STL
|
|||
|---|---|---|---|
|
#18+
rodbА входит ли в понятие Win32 использование NTDLL.DLL для доступа к файлам? по моим данным, длл-ки Win32 импользуют NTDLL.DLL NTDLL - это по моему Hardware Abstraction Layer, нечто вроде 32-битного BIOS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:43 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=365&tid=2031694]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 360ms |

| 0 / 0 |
