Runtime vs API
От: Аноним  
Дата: 04.03.08 17:14
Оценка:
Привет всем!

Я не совсем давно начал заниматься программированием (можно сказать недавно), и на протяжении своей бытности программистом столкнулся с парой вопросов на которые у меня не нашлось ответов. Сейчас же наступил момент, когда мне хотелось бы их получить.
1) Насколько я понял, если приложению необходимо обеспечить кроссплатформенность, то ограничиваются использованием только рантайма, без спицифичных для конкретной ОС API. (это так?) А если приложение будет работать ТОЛЬКО под Windows, то что является предпочтительным для использования: рантайм или API от ОС? Например: что лучше использовать для работы с файлами: fopen или CreateFile? Стоит ли их смешивать, или вообще отказаться от рантайма? (под смешиванием я понимаю совместное использование, а не ошибочное открытие с fopen и закрытия CloseHandle)
Я неоднакратно слышал что "API обеспечивают больший уровень сервиса по отношению к стандартным файловым функциям", но хотелось бы услышать ответ поподробнее.
2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL написаны собственные слассы строк CString, если существует стандартный string от рантайм? Чем он плох? И что предпочтительнее для проектов под Windows, но без MFC?

Ещё раз прошу прощения за глупые вопросы, но буду признателен за ответы.
Спасибо.
Re: Runtime vs API
От: AndrewJD США  
Дата: 04.03.08 17:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL написаны собственные слассы строк CString, если существует стандартный string от рантайм? Чем он плох? И что предпочтительнее для проектов под Windows, но без MFC?


1) Строки в MFC появились еще когда еще стандарта небыло. Кроме того они банально удобнее для разработки на WinAPI.
2) WTL были добавлены строки, реализация которых не завистит от с++ crt. В свое время это было важно для получения сверхмалого размера бинарника. Сейчас не используются.
3) Были добавлены в ATL в 7 студии. Т.е. сейчас MFC и WTL используют строку из ATL
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Runtime vs API
От: oziro Нигерия  
Дата: 04.03.08 19:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!

Привет!

А>Я не совсем давно начал заниматься программированием (можно сказать недавно), и на протяжении своей бытности программистом столкнулся с парой вопросов на которые у меня не нашлось ответов. Сейчас же наступил момент, когда мне хотелось бы их получить.


Изложу имхо.

А>1) Насколько я понял, если приложению необходимо обеспечить кроссплатформенность, то ограничиваются использованием только рантайма, без спицифичных для конкретной ОС API. (это так?)


Считаю приоритетом "рантайм" и библиотеки языка. Существует не только С\С++, а в других языках дотянуться до API бывает не так то просто и не нужно. Т.е. подход такой: если можно просто взять, и писать std::cout, std::fstream или тот же fopen() — то так и надо делать. С другой стороны, как только возникают более системные задачи — требуются потоки, проекции файлов в память. И не имея желания тащить в проект большую библиотеку (а иногда это указано ), конечно приходится юзать API — писать обертки.

А>Я неоднакратно слышал что "API обеспечивают больший уровень сервиса по отношению к стандартным файловым функциям", но хотелось бы услышать ответ поподробнее.

Обеспечивает. Хотя бы , например, аттрибуты безопасности доступа. Поподробнее — читаем о std:: в книгах по С++ и про API в Рихтере, Харте, Соломоне (Win) или в Стивенсе (unix) и находим отличие. Это будет исчерпывающе-подробно

А>2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL написаны собственные слассы строк CString, если существует стандартный string от рантайм? Чем он плох? И что предпочтительнее для проектов под Windows, но без MFC?

Как уже сказали, что давным-давно, в далекой галактике... не было std::string И тогда же был спроектирован, уж как смогли, MFC. И именно в контексте MFC его родной CString полностью себя оправдывает. И в контектсте ATL — его же стринг так же себя оправдывает. В настоящих реалиях, не используя этих библиотек, не вижу смысла их тащить только за ради их CString или какого-нибудь CFile.

Может сложиться впечатление, что куда то ушли все эти "MFC, ATL...". Нет, не ушли, но появились другие технологии для решения задач, для которых они были предназначены (.net) и появились другие библиотеки, Qt например. boost опять же настолько разнопланов, что трудно отнести его к какой либо категории, пожалуй что только не для GUI, а системных вещей (мультиплатформанных!) в нем много. Сетевая-сервисная системная библиотека ACE ... так же многоплатформанная. Кстати, наблюдается тенденция, что уж если пишется библиотека, то она мультиплатформенная. Причем в разных библиотеках реализованы разные подмножетсва чистой API функциональности, зачастую довольно обширные. И если есть возможность и целесообразность притянуть какую библиотеку в проект, то, имхо, стоит это сделать — обычно всякие нюансы при работе с API удобно обернуты библиотекой (см. например здесь
Автор(ы): Дуглас С.Шмидт, Стивен Д.Хьюстон

Это первый том двухтомника «Программирование сетевых приложений на
С++», посвященный библиотеке The ADAPTIVE Communication Environment
(ACE) – одной из самых переносимых C++ библиотек, предназначенной для
разработки сложных, многоплатформенных приложений, и широко
используемой во всем мире. В нем читатель знакомится с самой
библиотекой, ее историей, основными чертами ее архитектуры и
принципами использования.
)
Re[2]: Runtime vs API
От: Аноним  
Дата: 04.03.08 19:54
Оценка:
Всем спасибо за исчерпывающие ответы.
Re: Runtime vs API
От: NikeByNike Россия  
Дата: 04.03.08 21:29
Оценка: +1
Здравствуйте, Аноним, Вы писали:

Исходя из своего опыта:
А>1) Насколько я понял, если приложению необходимо обеспечить кроссплатформенность, то ограничиваются использованием только рантайма, без спицифичных для конкретной ОС API. (это так?) А если приложение будет работать ТОЛЬКО под Windows, то что является предпочтительным для использования: рантайм или API от ОС? Например: что лучше использовать для работы с файлами: fopen или CreateFile? Стоит ли их смешивать, или вообще отказаться от рантайма? (под смешиванием я понимаю совместное использование, а не ошибочное открытие с fopen и закрытия CloseHandle)
Почти всегда создавалась своя обёртка над файловой системой, так как:
  • CRT функции работают не на всех платформах, особенно это касается ембеддед (одного этого достаточно)
  • Как правило обёртка упрощает работу с функциями ОС и приводит форму этой работы к общему стандарту для проекта.

    А>Я неоднакратно слышал что "API обеспечивают больший уровень сервиса по отношению к стандартным файловым функциям", но хотелось бы услышать ответ поподробнее.

    Возможно предполагался более низкий уровень работы чему у CRT и STL и большее тонкое управление системой.

    А>2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL написаны собственные слассы строк CString, если существует стандартный string от рантайм? Чем он плох? И что предпочтительнее для проектов под Windows, но без MFC?

    Во-первых std::string — это скорее контейнер для строк, чем нормальный класс строки. Во-вторых, для движка мы используем модификации std::string, а для виндового UI — всё в перемешку.
  • Нужно разобрать угил.
    Re: Runtime vs API
    От: MasterZiv СССР  
    Дата: 04.03.08 21:38
    Оценка:
    Аноним 910 пишет:
    > 1) Насколько я понял, если приложению необходимо обеспечить
    > кроссплатформенность, то ограничиваются использованием только рантайма,
    > без спицифичных для конкретной ОС API. (это так?)

    Это так. Но проблема в том, что много чего на одном CRTL не напишешь.
    К сожалению. Но есть boost ...

    А если приложение
    > будет работать ТОЛЬКО под Windows, то что является предпочтительным для
    > использования: рантайм или API от ОС?

    Это зависит исключительно от требований к этому приложению.

    > для работы с файлами: fopen или CreateFile? Стоит ли их смешивать, или

    > вообще отказаться от рантайма? (под смешиванием я понимаю совместное
    > использование, а не ошибочное открытие с fopen и закрытия CloseHandle)

    Смешивать можно, если это нужно. Ничего криминального в этом нет.

    > Я неоднакратно слышал что "API обеспечивают больший уровень сервиса по

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

    Да, поскольку API конкретной OS обеспечивает всю функциональность
    данной OS в данном случае для работы с файлами. Но программа становиться
    "только для этой ОС". CRTL же использует подход "наибольшего общего
    кратного". Реализует только то, что есть везде.

    > 2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL

    > написаны собственные слассы строк CString, если существует стандартный
    > string от рантайм?

    Гы... сейчас начнется ....
    Но во-первых надо сказать, что конкретно CString конкретно в MFC
    появился тогда, когда STL-я еще и в проектах не было. И потом CString
    поддерживает много специфичных для Win32 функций, которых нет в STD.

    Чем он плох?

    Ну, как сказать ... многим. Нет быстрого копирования,
    нет подсчета ссылок (точнее они могут быть, но стандарт
    не оговаривает обязательность их наличия, а это — все равно
    что их нет), нет удобных функций обработки.
    Но тут опять-таки многое зависит
    от специфики приложения. Для одних приложений хватает, для других —
    нет.

    И что предпочтительнее для проектов под
    > Windows, но без MFC?

    WTL/ATL
    Posted via RSDN NNTP Server 2.1 beta
    Re: Runtime vs API
    От: игппук Беларусь  
    Дата: 04.03.08 22:50
    Оценка:
    использование стандартных функций не всегда дает гарантию кроссплатформенного кода (или близкого к нему). к примеру, для PalmOS, несмотря на то, что компилятор поддерживает стандартные функции С и С++, я бы порекомендовал использовать API функции, в силю большого количества нюансов, которые можно полностью контролировать только при использовании API. если вам нужен кроссплатформенный код, то я бы порекомендовал использовать специально для этого предназначенные библиотеки.
    проклятый антисутенерский закон
    Re[2]: Runtime vs API
    От: MasterZiv СССР  
    Дата: 05.03.08 07:06
    Оценка:
    игппук пишет:

    > использование стандартных функций не всегда дает гарантию

    > кроссплатформенного кода (или близкого к нему).

    Всегда дает гарантию.
    Posted via RSDN NNTP Server 2.1 beta
    Re[3]: Runtime vs API
    От: игппук Беларусь  
    Дата: 05.03.08 09:04
    Оценка:
    Здравствуйте, MasterZiv, Вы писали:

    MZ>Всегда дает гарантию.


    я уже выше написал, что нет гарантии, что код будет работат без багов.
    проклятый антисутенерский закон
    Re: Runtime vs API
    От: CreatorCray  
    Дата: 05.03.08 10:48
    Оценка:
    Здравствуйте, <Аноним>, Вы писали:

    Я так понимаю под рантаймом тут понимается CRT + STL?

    А>1) Насколько я понял, если приложению необходимо обеспечить кроссплатформенность, то ограничиваются использованием только рантайма, без спицифичных для конкретной ОС API. (это так?)

    It depends. А если в рантайме нет необходимого функционала? Рантайм довольно обобщен и абстрагирован от конкретной ОС.

    А>А если приложение будет работать ТОЛЬКО под Windows, то что является предпочтительным для использования: рантайм или API от ОС? Например: что лучше использовать для работы с файлами: fopen или CreateFile? Стоит ли их смешивать, или вообще отказаться от рантайма? (под смешиванием я понимаю совместное использование, а не ошибочное открытие с fopen и закрытия CloseHandle)

    Я не пользуюсь рантаймом совсем (исключение поддержка float и т.п.) — очень уж он убог. Кроме того, все равно вызов рантайма сведется к вызовам API, только еще будет выполнена кучка кода, который зачастую попросту делает ненужную работу. Потоки STL вообще редкое убожество. Для текста еще пойдет, но не для работы с бинарными данными.
    Все разумеется ИМХО.

    А>Я неоднакратно слышал что "API обеспечивают больший уровень сервиса по отношению к стандартным файловым функциям", но хотелось бы услышать ответ поподробнее.

    Достаточно почитать что можно сделать с файлом через тот же fopen и CreateFile.

    А>2) Никак не могу взять в толк, зачем в библиотеках MFC, ATL, WTL написаны собственные слассы строк CString, если существует стандартный string от рантайм?

    А> Чем он плох? И что предпочтительнее для проектов под Windows, но без MFC?
    Ну, вообще std::string сам по себе не так уж и плох. Плохо то, что его реализации в разных рантаймах бывают разными.
  • В одном есть буфер для маленьких строк — т.е. не происходит выделение памяти при работе с короткими строками, зато размер инстанса класса строки больше на размер этого буфера, вне зависимости используется он или нет.
  • В другом хранится счетчик ссылок и одинаковые строки в памяти хранятся в одном экземпляре, на который ссылаются все инстансы
  • В третьем вообще никаких ухищрений — все тупо в лоб.

    Поэтому когда перекомпиливаешь программу под другим рантаймом могут вылезти различного рода нюансы в поведении — например начнет работать медленнее и жрать больше памяти.
    Потому и сделали МС свой класс, для которого они могут гарантировать неизменное поведение вне зависимости от рантайма.
    Кроме того, насколько я помню, MFC CString появился до того как стандартизировали STL.

    Где то так...
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
  • Забанили по IP, значит пора закрыть эту страницу.
    Всем пока
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.