LINUX.ORG.RU
ФорумTalks

Почему на С++ пишут как на С?

 ,


0

4

Навеяно топиком http://slonik-v-domene.livejournal.com/142619.html

Вот зачем использовать функции из библиотеки С в проектах «на С++», когда можно использовать родные средства? Например в качестве типа строк использовать char* вместо std::string, гораздо более безопасного, вместо new / delete - malloc / free и так далее?

Чего я не понимаю? Может есть причины?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Вот зачем использовать функции из библиотеки С в проектах «на С++», когда можно использовать родные средства?

Затем, что «родные» средства часто работают по-другому, чем сишные, а таже могут быть по-разному реализованы в разным компиляторах. Иногда это принципиально.

Конкретно по упомянутым случаям:

char* вместо std::string

1) конструктор std::string копирует исходную строку, char * можно передавать без копирования, в т.ч. указатели на подстроки (важно в высокоскоростных парсерах типа pugixml) 2) у std::string, в зависимости от реализации, может быть copy on write, а может не быть (исправлено в С++11). Так же может быть разным набор внутренних полей объекта, что влияет на расход памяти при хранении большого количества строк.

вместо new / delete - malloc / free

Для new нет аналога realloc

annulen ★★★★★
()
Ответ на: комментарий от Stahl

Уже хотя бы то причина, что подавляющее большинство плюсовиков писали до него на Си.

В этом тысячелетии это уже не так (не знаю, хорошо или плохо это)

annulen ★★★★★
()
Ответ на: комментарий от tailgunner

Поэтому в Си++ использут RAII, а в Си - goto.

Для чего используют? Чтобы освобождать занятые ресурсы?

Причем здесь логика построения кода и правила на количество выходов из функции?

Этот ваш RAII для того и нужен, что из функции могут быть самые неожиданные выходы благодаря исключениям.

ien
()

вместо new / delete - malloc / free

Иногда бывает нужно выделить просто кусок памяти, не инициализируя его. Плюс new может кинуть исключение.

Про operator new() и nothrow знают немногие, если что.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Pavval

То что вошло - можно как то использовать. Аргументация очень проста. Мол, мутная фигня с шаблонами в которых без пол-литры не разберёшься. C++ вообще такой язык где стандартные библиотеки это достаточно опциональная вещь.

ranka-lee
()
Ответ на: комментарий от ien

Поэтому в Си++ использут RAII, а в Си - goto.

Для чего используют? Чтобы освобождать занятые ресурсы?

Чтобы получать ясный и надежный код. Естественно, что аккуратное обращение с ресурсами входит в понятие «надежность».

Причем здесь логика построения кода

«Логика построения кода», вау.

правила на количество выходов из функции

Это правило сформулировано в 70-х. К разговору о RAII прямого отношения не имеет.

tailgunner ★★★★★
()
Ответ на: комментарий от Kroz

Чтож, некоторые люди приходят на форум чтобы узнать что-то новое,

И ты пришел, чтобы чтобы узнать, различаю ли я качество кода и качество алгоритма. Ты это узнал.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

И ты пришел, чтобы чтобы узнать, различаю ли я качество кода и качество алгоритма. Ты это узнал.

Как раз меня это мало волнует. Думал, может тебя интересует - похоже, что нет.

Вот два остальных вопроса без ответа: Почему на С++ пишут как на С? (комментарий) . Ни обоснования, ни примера; пустозвон в общем.

Нет, я-то проживу без этого. Да и wiki уже почитал. Но к слову о ЧСВ...

Kroz ★★★★★
()
Ответ на: комментарий от tailgunner

Это правило сформулировано в 70-х. К разговору о RAII прямого отношения не имеет.

Ну да, ну да. Я и намекал, что разговор не про RAII, а про тезис «много выходов из функций повышает сложность кода»:

И в чем проблема в нескольких точках возврата?

Код становится труднее для понимания и модификации.

У этого «правила» (относительно языков Си и Си++) есть какие-то аргументы, помимо того, что «мне так больше нравится» ?

ien
()

Например в качестве типа строк использовать char* вместо std::string

А в чём проблема и почему ты считаешь это неправильным? Почему в С++ нельзя использовать char*? Можно и нужно. Строки с использованием char* являются такой же частью языка как и string. Где-то удобнее использовать указатель, а где-то объект.

mbivanyuk ★★★★★
()
Ответ на: комментарий от tailgunner

форматный вывод Си удобнее угребищного поточного вывода Си++.

+100500

kravich ★★★★
()
Ответ на: комментарий от Lincor

Патамушта упоротые разработчики C++ не додумались сделать нормального форматирования.
Да и вообще, как плюсы были сборищем костылей и подпорок, так до сих пор ими и остались.

WatchCat ★★★★★
()
Ответ на: комментарий от cvs-255

Выдержка из стандарта:
--------------
An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant.
--------------

WatchCat ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

ISO/IEC 9899 - Programming languages - C

Это стандарт С.
Либо ты приведи определение из «своего» стандарта, тогда и посмотрим.

WatchCat ★★★★★
()

Потому, что в вашем радиотехническом типа «университете» непригодные в реальном информационном производстве нищеброды лузеры-преподаватели не объяснили, что на свете есть вот такие книжки

http://www.e-reading.ws/book.php?book=1002058

http://www.coders-library.ru/files-view-535.html

Хоть мне самому С++ не нужен, а нужен только для JVM (курите исходники реального проекта, а не «хеллоуорда»), я не перестаю удивляться профнепригодности кульхацкеров.

Bioreactor ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Да нихрена.. Подумай, что будет, если при выделени второй строки за ней будет лежать не ноль. Тебе никто не гарантирует, что str2[32*1000+1] равен нулю. При добавлении строки str2 в этом случае в конце будет добавлен мусор или в некоторых случаях будет сегфоулт.

vromanov ★★
()
Ответ на: комментарий от LongLiveUbuntu

А str2 у тебя не std::string а просто указатель на char

vromanov ★★
()
Ответ на: комментарий от ien

Я и намекал, что разговор не про RAII

Странно, что тебе это не было очевидно.

У этого «правила» (относительно языков Си и Си++) есть какие-то аргументы, помимо того, что «мне так больше нравится» ?

Да. Всё это было обсуждено и закрыто 30-40 лет назад.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Странно, что тебе это не было очевидно.

Да. Всё это было обсуждено и закрыто 30-40 лет назад.

ОК. Нет — значит нет. :))

ien
()
Ответ на: комментарий от ien

У этого «правила» (относительно языков Си и Си++) есть какие-то аргументы, помимо того, что «мне так больше нравится» ?

Да.

ОК. Нет — значит нет. :))

Засчитай же себе блестящую победу в полемике, да напиши еще return из середины функции.

tailgunner ★★★★★
()
Ответ на: комментарий от ranka-lee

Аргументация очень проста. Мол, мутная фигня с шаблонами в которых без пол-литры не разберёшься.

Покажи мне в том же boost::asio шаблоны. Если ты не в курсе, то разные части буста разны чуть более, чем полностью. И обобщать на весь буст из-за неосиляторства отдельной либы - тупизм.

Pavval ★★★★★
()

А в чём принципиальное отличие char* от std::string, если последний в 2014 году до сих пор нативно не умеет в юникод? А с костылями и char* можно юзать.

border-radius
()
Ответ на: комментарий от tailgunner

Это правило сформулировано в 70-х.

Считаю абсолютно нормальным код:

SomeResultType DoSmth(const std::string& arg)
{
    if( SomeCondition() )
    {
          return ErrorResultType;
    }
    // Далее собственно логика DoSmth
    // .....
    return SomeActualResultType;
}

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от ranka-lee

Короче, существенных преимуществ std::wstring перед wchar_t* не даёт, и там и там для работы с единственной в мире нормальной кодировкой нужны костылисторонние библиотеки.

border-radius
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.