Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
#1

Как правильно сделать выбор между С и С++? - C++

08.11.2016, 10:02. Просмотров 474. Ответов 39
Метки нет (Все метки)

В первую очередь интересует с точки зрения потребления ресурсов программы а так же быстродействие
Ещё интересно, есть ли операции, которые быстрее в плюсах чем на Си?
Мне нравятся плюсы, но многие пишут что плюсы медленнее в целом чем Си а так же у плюсов есть существенный оверхед потребления ресурсов а у Си он меньше
В каких ситуациях плюсы в целом по скорости и производительности могут быть лучше Си (и могут ли вообще?)
На простых тестах на быстродействие в принципе почти одно и то же (цифры времени исполнения бегают то в пользу си то в пользу плюсов)
Понимаю что одним словом все не опишешь но хотелось бы получить хоть какую то картину
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2016, 10:02     Как правильно сделать выбор между С и С++?
Посмотрите здесь:

C++ Неккоректность типов.Как правильно сделать?
Включение, как правильно сделать инициализацию C++
Помогите сделать выбор между двумя книгами C++
Как правильно сделать список C++
C++ Как лучше это сделать?. а главное, как правильно? (Информационная система «Железнодорожный вокзал»)
Как правильно сделать функцию? (Из Паскаля в С++) C++
C++ Подскажите как правильно сделать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
853 / 592 / 116
Регистрация: 28.07.2012
Сообщений: 1,597
08.11.2016, 10:34     Как правильно сделать выбор между С и С++? #2
Цитата Сообщение от sys_beginner Посмотреть сообщение
хотелось бы получить хоть какую то картину
Все, что написано на C, можно написать и на C++ без каких-либо потерь производительности.
К тому же, на C++ можно написать менее оптимальную программу (которую к тому же может "затащить" компилятор), но напишешь ты ее намного быстрее.

Короче, как научишься, такой код и будешь писать.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 10:49  [ТС]     Как правильно сделать выбор между С и С++? #3
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Все, что написано на C, можно написать и на C++ без каких-либо потерь производительности.
А что скажете насчет иерархических структур для классов? Например, такой код более понятный(если же конечно использовать осмысленные имена), и имеет некоторый уровень абстракции что является плюсом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class test
{
    virtual void foo() = 0;
};
 
class testrealization : test
{
    public:
    virtual void foo() override
    {
        std::cout << "test_foo";
    }
};
 
int main()
{
    testrealization t;
    t.foo();
    return 0;
}
Но работая в Си пришлось бы тупо написать простую функцию. Если использовать иерархические возможности плюсов, он будет уступать по скорости Си?

Добавлено через 2 минуты
конкретно: наследование, протитопы классов, области видимости
ведь кода получается больше чем в Си

Добавлено через 43 секунды
Но получается хорошая структура
MrGluck
Ворчун
Эксперт CЭксперт С++
6634 / 3825 / 502
Регистрация: 29.11.2010
Сообщений: 10,110
08.11.2016, 10:50     Как правильно сделать выбор между С и С++? #4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
без каких-либо потерь производительности.
А Страуструп обещал падение в среднем не более, чем на 4%.
Однако стоит понимать, что С и С++ совершенно разные языки с разной идеологией и подходами. И в С++ гораздо больше средств написать более безопасный код. А также сократить количество строк кода, что (очень) грубо говоря, линейно отразиться на количестве ошибок в коде, а значит и скорости.

Остались ниши, где еще используют С, например программирование микроконтроллеров. В остальном же, предпочитают С++, вдобавок язык динамично развивается.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ещё интересно, есть ли операции, которые быстрее в плюсах чем на Си?
Выполнение программ на этапе компиляции, к примеру.
Цитата Сообщение от sys_beginner Посмотреть сообщение
многие пишут что плюсы медленнее в целом чем Си а так же у плюсов есть существенный оверхед потребления ресурсов а у Си он меньше
Это все сказки сишных эльфов. Не переходите на сторону зла.
А еще,
многие пишут что Си медленнее в целом чем ассемблер а так же у Си есть существенный оверхед потребления ресурсов а у ассемблера он меньше
Цитата Сообщение от sys_beginner Посмотреть сообщение
На простых тестах на быстродействие в принципе почти одно и то же
Главное - это алгоритм работы программы. С помощью любого языка можно написать в 100500 раз медленнее, чем на другом, даже если изначально первый "быстрее и лучше" второго.

Вообщем, пишите на том, что нравится и что будет вам потом давать хлеб.

Цитата Сообщение от nonedark2008 Посмотреть сообщение
напишешь ты ее намного быстрее.
В условиях задачи "конь в ваакуме", быстрее напишешь на том, что знаешь.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 11:00  [ТС]     Как правильно сделать выбор между С и С++? #5
Цитата Сообщение от MrGluck Посмотреть сообщение
И в С++ гораздо больше средств написать более безопасный код
А что именно вы подразумеваете под безопасностью? Атаки на приложение или что то иное?

Цитата Сообщение от MrGluck Посмотреть сообщение
Главное - это алгоритм работы программы.
А если оба алгоритма условно идеальны на каждом из языков(с/с++), что в этом случае можете сказать?

Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
А также сократить количество строк кода, что (очень) грубо говоря, линейно отразиться на количестве ошибок в коде, а значит и скорости.
В моем примере выше кода больше чем на си но с точки зрения идеологии он лучше

Добавлено через 1 минуту
В первую очередь меня интересует использование всех возможностей ООП без потери производительности в сравнении с Си (с учетом того что алгоритмы написаны максимально эффективно независимо от языка)

Добавлено через 26 секунд
И конечно же использование template-ов
Renji
1794 / 1212 / 283
Регистрация: 05.06.2014
Сообщений: 3,482
08.11.2016, 11:13     Как правильно сделать выбор между С и С++? #6
Цитата Сообщение от sys_beginner Посмотреть сообщение
Мне нравятся плюсы, но многие пишут что плюсы медленнее в целом чем Си а так же у плюсов есть существенный оверхед потребления ресурсов а у Си он меньше
Медленнее плюсовые потоки, потому что ради универсальности собраны на виртуальных функциях. Причем, метод сборки явно придумывали упоровшись веществами. Можно было эти самые виртуальные методы сунуть в std::istream/std::ostream, от которых отнаследованы все потоки. Но это же для слабаков, мы сунем в std::istream только указатель на std::streambuf, в котором уже и будут лежать виртуальные методы. Потому что это позволяет взять std::streambuf от файлового потока и сунуть его в потом std::cin. Ну круто же, ты вроде данные с консоли читаешь, а они на самом деле из файла идут. Потом вызывается деструктор файлового потока, прибивает этот самый std::streambuf (право владения то мы передать забыли) и угадайте, что после этого происходит при попытке чтения из cin?

Но вам вроде бы никто не мешает пользоваться плюшками даваемыми синтаксисом плюсов (хоть той же перегрузкой имен), избегая не очень быстрых плюсовых потоков.
Цитата Сообщение от sys_beginner Посмотреть сообщение
А что именно вы подразумеваете под безопасностью? Атаки на приложение или что то иное?
К примеру, у сишных строк размер фиксирован, а значит есть риск что этот самый размер внезапно кончится. С непредсказуемым для программы эффектом. А плюсовому std::string то что, он резиновый.
GbaLog-
Не Эксперт C++
2515 / 1071 / 270
Регистрация: 24.08.2014
Сообщений: 3,918
Записей в блоге: 1
Завершенные тесты: 2
08.11.2016, 11:13     Как правильно сделать выбор между С и С++? #7
Цитата Сообщение от sys_beginner Посмотреть сообщение
ООП без потери производительности в сравнении с Си
В Си нет встроенного ООП, а если его эмулировать, то смотрится это, мягко говоря, не очень.
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 11:19  [ТС]     Как правильно сделать выбор между С и С++? #8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
Renji
1794 / 1212 / 283
Регистрация: 05.06.2014
Сообщений: 3,482
08.11.2016, 11:21     Как правильно сделать выбор между С и С++? #9
Цитата Сообщение от sys_beginner Посмотреть сообщение
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 11:30  [ТС]     Как правильно сделать выбор между С и С++? #10
Цитата Сообщение от Renji Посмотреть сообщение
Но вам вроде бы никто не мешает пользоваться плюшками даваемыми синтаксисом плюсов (хоть той же перегрузкой имен), избегая не очень быстрых плюсовых потоков.
Т.е работы с потоками использовать сишные функции вместо std::что-то там?
Цитата Сообщение от Renji Посмотреть сообщение
К примеру, у сишных строк размер фиксирован, а значит есть риск что этот самый размер внезапно кончится.
Есть же malloc/realloc

Раз уж мы заговорили про строки, то как работает тот момент когда используется резиновая строка в С++? Выделяется какой то кусок памяти который по необходимости расширяется выделением доп. памяти?

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
Так и в си вроде через указатели
http://rextester.com/VVL13734
В примере создан указатель на функцию, которому присваивается имя функции без взятия явного адреса и ошибок не происходит
Renji
1794 / 1212 / 283
Регистрация: 05.06.2014
Сообщений: 3,482
08.11.2016, 11:44     Как правильно сделать выбор между С и С++? #11
Цитата Сообщение от sys_beginner Посмотреть сообщение
Т.е работы с потоками использовать сишные функции вместо std::что-то там?
Для файловых потоков - да, использовать сишные аналоги. Правда, там уже не будет плюсовой универсальности "хоть std::ifstream, хоть std::stringstream, функция любой текстовый поток скушает".
Цитата Сообщение от sys_beginner Посмотреть сообщение
Есть же malloc/realloc
В теории - есть. На практике scanf никаких malloc/realloc вызывать не будет, надеясь что принимающего буфера хватит и так. В принципе, у std::string под капотом все те же malloc/realloc, но фокус в том что std::string то как раз malloc/realloc вызовет сам. А не будет по сишной привычке надеяться "авось и так места хватит".
Цитата Сообщение от sys_beginner Посмотреть сообщение
Так и в си вроде через указатели
Ну да, в Си виртуальность достигается через указатели. Но их надо явно объявить и явно заполнить. А в плюсах все это упрятано под капот. Просто приписал virtual и все объявления и заполнения берет на себя компилятор.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 11:54  [ТС]     Как правильно сделать выбор между С и С++? #12
Renji,
Ясно. Спасибо!

Добавлено через 6 минут
Renji,
Кстати в Си тоже можно сделать универсальность в работе с потоками приводя их явно к FILE (не уверен, что для всех потоков). Видимо это тоже несет какой то оверхед?
MrGluck
Ворчун
Эксперт CЭксперт С++
6634 / 3825 / 502
Регистрация: 29.11.2010
Сообщений: 10,110
08.11.2016, 11:58     Как правильно сделать выбор между С и С++? #13
Цитата Сообщение от sys_beginner Посмотреть сообщение
А что именно вы подразумеваете под безопасностью? Атаки на приложение или что то иное?
Например, в С++ есть средства, соответствующих идиоме RAII. Таким образом, меньше вероятность утечки данных. И есть много средств, заменяющих магию с побитовыми операциями или работе с сырой памятью. И более жесткая проверка типов.
Взять тот же банальный пример, когда в printf/scanf передаётся переменная не того типа, что ожидалось в первом параметре функции. Или разновидности кастов типа переменных, заместо Сишного "заткнись и сделай как я сказал".

Я не говорю, что Си - плохой язык. Но у него своя специфика.

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
В моем примере выше кода больше чем на си но с точки зрения идеологии он лучше
Что мешает написать такой же код и в С++? Он вполне себе будет работать. Вы просто решили выбрать парадигму ООП. Но обсуждать выбор без конкретной задачи бессмысленно, однако стоит заметить, что у плюсов есть выбор.

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
что в этом случае можете сказать?
Тогда стоит смотреть на другие характеристики кода. Это опять же, зависит от задачи. Кто-то пишет программы запуска ракет, а кто-то курсач сдаёт.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 12:06  [ТС]     Как правильно сделать выбор между С и С++? #14
Цитата Сообщение от MrGluck Посмотреть сообщение
Например, в С++ есть средства, соответствующих идиоме RAII. Таким образом, меньше вероятность утечки данных. И есть много средств, заменяющих магию с побитовыми операциями или работе с сырой памятью.
Ну тут скорее всего все основано в страховании от ошибок при разработке и многое сделано уже за разработчика и очень эффективно, да?
Цитата Сообщение от MrGluck Посмотреть сообщение
Но обсуждать выбор без конкретной задачи бессмысленно, однако стоит заметить, что у плюсов есть выбор.
Не пойму, зачем нужна конкретная задача, если мы обсуждаем эффективность инструментов. Ведь программа не знает чем она является, запускателем ракет или чем то другим. А если бы и знала, она бы не "испугалась и начала работать быстрее только потому что запускает ракеты"
Renji
1794 / 1212 / 283
Регистрация: 05.06.2014
Сообщений: 3,482
08.11.2016, 12:09     Как правильно сделать выбор между С и С++? #15
Цитата Сообщение от sys_beginner Посмотреть сообщение
Кстати в Си тоже можно сделать универсальность в работе с потоками приводя их явно к FILE (не уверен, что для всех потоков).
Если вы про "приведение" вида FILE(str), то это трюк серии "возьмем зайца и запишем в документы как медведя". Даже если Си позволяет записать зайца как в медведя, этот заяц ульи с медом разорять не начнет.
И вообще, сишный аналог stringstream, это обычная сишная строка, которую заполняют snprintf. Понятное дело, к файлам она никакого отношения не имеет.
MrGluck
Ворчун
Эксперт CЭксперт С++
6634 / 3825 / 502
Регистрация: 29.11.2010
Сообщений: 10,110
08.11.2016, 12:10     Как правильно сделать выбор между С и С++? #16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну тут скорее всего все основано в страховании от ошибок при разработке и многое сделано уже за разработчика и очень эффективно, да?
Да. И, что не менее важно, протестировано, универсально и работает корректно, в отличии от самописных велосипедов.

Цитата Сообщение от sys_beginner Посмотреть сообщение
зачем нужна конкретная задача, если мы обсуждаем эффективность инструментов.
Можно с таким же успехом обсуждать эффективность молотка и отвёртки.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 12:29  [ТС]     Как правильно сделать выбор между С и С++? #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Да. И, что не менее важно, протестировано, универсально и работает корректно, в отличии от самописных велосипедов.
Есть мнение что это не всегда хорошо потому что когда на первом месте производительность, разработчик зная природу данных в собственной реализации сможет избежать некоторых телодвижений которые делаются для универсальности и такое решение будет более эффективное чем готовое

Цитата Сообщение от MrGluck Посмотреть сообщение
Можно с таким же успехом обсуждать эффективность молотка и отвёртки.
Ну допустим речь об алгоритмах + структуре программы. Предположим если взять идентичный набор алгоритмов из Си и обернуть их в классы на плюсах, которые наследуются от определенных абстрактных классов (возможно несколько уровневое наследование(не множественное))
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
08.11.2016, 12:51     Как правильно сделать выбор между С и С++? #18
Цитата Сообщение от sys_beginner Посмотреть сообщение
Предположим если взять идентичный набор алгоритмов из Си и обернуть их в классы на плюсах, которые наследуются от определенных абстрактных классов (возможно несколько уровневое наследование(не множественное))
Зачем вот так сравнивать? Зачем тут наследование? Просто, чтобы было? Это похоже на утверждение, что обязательным атрибутом программы на С++ является наследование и классы - это совсем не так. Из непонимания этого идут дальнейшие ошибочные выводы.
И если нужно в сравнении использовать классы С++, т.е. ООП-подход, то уж, будьте добры, сранивайте его с ООП-подходом на С. Иначе в итоге сравнение выльется в ООП vs Процедурное программирование. И выше уже сказали, С++ дает выбор, если в какой-то задаче процедурный подход более эффективен, то С++ даст его использовать без проблем.
В конечном счете все сводится к тому, понимает ли программист что он делает.
Undisputed
132 / 63 / 13
Регистрация: 10.06.2014
Сообщений: 1,092
Завершенные тесты: 3
08.11.2016, 13:12  [ТС]     Как правильно сделать выбор между С и С++? #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем вот так сравнивать?
А чем не сравнение?
http://rextester.com/ZOM40340 вариант на Си
http://rextester.com/ALE79455 плюсовый вариант

Понятное дело что на hello world тестах ничего особого не будет выявлено. Просто хочу знать, если использовать тупо си с классами (только ради архитектурных решений), будет ли такой подход уступать по скорости Си если тестировать алгоритмы большого объема на двух языках просто в одном случае будут обертки в классы.
Цитата Сообщение от DrOffset Посмотреть сообщение
то уж, будьте добры, сранивайте его с ООП-подходом на С
Это было бы некорректно. Мы же не обсуждаем эффективность парадигм, а эффективность работы программы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2016, 13:19     Как правильно сделать выбор между С и С++?
Еще ссылки по теме:

C++ Подскажите как правильно сделать
C++ Подскажите как правильно сделать
Как правильно сделать самообновление программы? C++
Как правильно сделать сортировку? C++
C++ Как правильно сделать компаратор для структуры

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт CЭксперт С++
6634 / 3825 / 502
Регистрация: 29.11.2010
Сообщений: 10,110
08.11.2016, 13:19     Как правильно сделать выбор между С и С++? #20
Цитата Сообщение от sys_beginner Посмотреть сообщение
Мы же не обсуждаем эффективность парадигм, а эффективность работы программы.
По аналоги: что лучше - вбить гвоздь молотком или ввинтить саморез отвёрткой, если нужно повесить картину.
Разные инструменты с разными подходами.

Почему, если С++, то сразу ООП? Степанов бы очень огорчился...
Yandex
Объявления
08.11.2016, 13:19     Как правильно сделать выбор между С и С++?
Ответ Создать тему
Опции темы

Текущее время: 18:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru