Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
1

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

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

Author24 — интернет-сервис помощи студентам
В первую очередь интересует с точки зрения потребления ресурсов программы а так же быстродействие
Ещё интересно, есть ли операции, которые быстрее в плюсах чем на Си?
Мне нравятся плюсы, но многие пишут что плюсы медленнее в целом чем Си а так же у плюсов есть существенный оверхед потребления ресурсов а у Си он меньше
В каких ситуациях плюсы в целом по скорости и производительности могут быть лучше Си (и могут ли вообще?)
На простых тестах на быстродействие в принципе почти одно и то же (цифры времени исполнения бегают то в пользу си то в пользу плюсов)
Понимаю что одним словом все не опишешь но хотелось бы получить хоть какую то картину
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2016, 10:02
Ответы с готовыми решениями:

Помогите сделать выбор между двумя книгами
Хотел бы летом углубить свои знания по программированию на C++, поэтому решил купить книгу....

Как сделать правильный выбор между C# и Java?
Здравствуйте. В далеком прошлом, я занимался пустой тратой времени. А именно - выбором языков...

Необходимо сделать выбор между: Netgear WN3000RP и LINKSYS RE1000-EE, как репитеры для NETGEAR WNDR4000
Доброго всем дня!:help::help: Подскажите кто сталкивался в работе с Ретранслятором Linksys...

Как правильно дублировать в actionscript 2.0 и как правильно сделать объект для дублирования
Я только начал изучать actionscript и прошу мне помочь. Как правильно дублировать в actionscript...

39
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
08.11.2016, 10:34 2
Цитата Сообщение от sys_beginner Посмотреть сообщение
хотелось бы получить хоть какую то картину
Все, что написано на C, можно написать и на C++ без каких-либо потерь производительности.
К тому же, на C++ можно написать менее оптимальную программу (которую к тому же может "затащить" компилятор), но напишешь ты ее намного быстрее.

Короче, как научишься, такой код и будешь писать.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
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 секунды
Но получается хорошая структура
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.11.2016, 10:50 4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
без каких-либо потерь производительности.
А Страуструп обещал падение в среднем не более, чем на 4%.
Однако стоит понимать, что С и С++ совершенно разные языки с разной идеологией и подходами. И в С++ гораздо больше средств написать более безопасный код. А также сократить количество строк кода, что (очень) грубо говоря, линейно отразиться на количестве ошибок в коде, а значит и скорости.

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

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

Цитата Сообщение от nonedark2008 Посмотреть сообщение
напишешь ты ее намного быстрее.
В условиях задачи "конь в ваакуме", быстрее напишешь на том, что знаешь.
2
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 11:00  [ТС] 5
Цитата Сообщение от MrGluck Посмотреть сообщение
И в С++ гораздо больше средств написать более безопасный код
А что именно вы подразумеваете под безопасностью? Атаки на приложение или что то иное?

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

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

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

Добавлено через 26 секунд
И конечно же использование template-ов
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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 то что, он резиновый.
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
08.11.2016, 11:13 7
Цитата Сообщение от sys_beginner Посмотреть сообщение
ООП без потери производительности в сравнении с Си
В Си нет встроенного ООП, а если его эмулировать, то смотрится это, мягко говоря, не очень.
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 11:19  [ТС] 8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
08.11.2016, 11:21 9
Цитата Сообщение от sys_beginner Посмотреть сообщение
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 11:30  [ТС] 10
Цитата Сообщение от Renji Посмотреть сообщение
Но вам вроде бы никто не мешает пользоваться плюшками даваемыми синтаксисом плюсов (хоть той же перегрузкой имен), избегая не очень быстрых плюсовых потоков.
Т.е работы с потоками использовать сишные функции вместо std::что-то там?
Цитата Сообщение от Renji Посмотреть сообщение
К примеру, у сишных строк размер фиксирован, а значит есть риск что этот самый размер внезапно кончится.
Есть же malloc/realloc

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

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
Так и в си вроде через указатели
http://rextester.com/VVL13734
В примере создан указатель на функцию, которому присваивается имя функции без взятия явного адреса и ошибок не происходит
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
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 и все объявления и заполнения берет на себя компилятор.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 11:54  [ТС] 12
Renji,
Ясно. Спасибо!

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
что в этом случае можете сказать?
Тогда стоит смотреть на другие характеристики кода. Это опять же, зависит от задачи. Кто-то пишет программы запуска ракет, а кто-то курсач сдаёт.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 12:06  [ТС] 14
Цитата Сообщение от MrGluck Посмотреть сообщение
Например, в С++ есть средства, соответствующих идиоме RAII. Таким образом, меньше вероятность утечки данных. И есть много средств, заменяющих магию с побитовыми операциями или работе с сырой памятью.
Ну тут скорее всего все основано в страховании от ошибок при разработке и многое сделано уже за разработчика и очень эффективно, да?
Цитата Сообщение от MrGluck Посмотреть сообщение
Но обсуждать выбор без конкретной задачи бессмысленно, однако стоит заметить, что у плюсов есть выбор.
Не пойму, зачем нужна конкретная задача, если мы обсуждаем эффективность инструментов. Ведь программа не знает чем она является, запускателем ракет или чем то другим. А если бы и знала, она бы не "испугалась и начала работать быстрее только потому что запускает ракеты"
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
08.11.2016, 12:09 15
Цитата Сообщение от sys_beginner Посмотреть сообщение
Кстати в Си тоже можно сделать универсальность в работе с потоками приводя их явно к FILE (не уверен, что для всех потоков).
Если вы про "приведение" вида FILE(str), то это трюк серии "возьмем зайца и запишем в документы как медведя". Даже если Си позволяет записать зайца как в медведя, этот заяц ульи с медом разорять не начнет.
И вообще, сишный аналог stringstream, это обычная сишная строка, которую заполняют snprintf. Понятное дело, к файлам она никакого отношения не имеет.
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.11.2016, 12:10 16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну тут скорее всего все основано в страховании от ошибок при разработке и многое сделано уже за разработчика и очень эффективно, да?
Да. И, что не менее важно, протестировано, универсально и работает корректно, в отличии от самописных велосипедов.

Цитата Сообщение от sys_beginner Посмотреть сообщение
зачем нужна конкретная задача, если мы обсуждаем эффективность инструментов.
Можно с таким же успехом обсуждать эффективность молотка и отвёртки.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 12:29  [ТС] 17
Цитата Сообщение от MrGluck Посмотреть сообщение
Да. И, что не менее важно, протестировано, универсально и работает корректно, в отличии от самописных велосипедов.
Есть мнение что это не всегда хорошо потому что когда на первом месте производительность, разработчик зная природу данных в собственной реализации сможет избежать некоторых телодвижений которые делаются для универсальности и такое решение будет более эффективное чем готовое

Цитата Сообщение от MrGluck Посмотреть сообщение
Можно с таким же успехом обсуждать эффективность молотка и отвёртки.
Ну допустим речь об алгоритмах + структуре программы. Предположим если взять идентичный набор алгоритмов из Си и обернуть их в классы на плюсах, которые наследуются от определенных абстрактных классов (возможно несколько уровневое наследование(не множественное))
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
08.11.2016, 12:51 18
Цитата Сообщение от sys_beginner Посмотреть сообщение
Предположим если взять идентичный набор алгоритмов из Си и обернуть их в классы на плюсах, которые наследуются от определенных абстрактных классов (возможно несколько уровневое наследование(не множественное))
Зачем вот так сравнивать? Зачем тут наследование? Просто, чтобы было? Это похоже на утверждение, что обязательным атрибутом программы на С++ является наследование и классы - это совсем не так. Из непонимания этого идут дальнейшие ошибочные выводы.
И если нужно в сравнении использовать классы С++, т.е. ООП-подход, то уж, будьте добры, сранивайте его с ООП-подходом на С. Иначе в итоге сравнение выльется в ООП vs Процедурное программирование. И выше уже сказали, С++ дает выбор, если в какой-то задаче процедурный подход более эффективен, то С++ даст его использовать без проблем.
В конечном счете все сводится к тому, понимает ли программист что он делает.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
08.11.2016, 13:12  [ТС] 19
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем вот так сравнивать?
А чем не сравнение?
http://rextester.com/ZOM40340 вариант на Си
http://rextester.com/ALE79455 плюсовый вариант

Понятное дело что на hello world тестах ничего особого не будет выявлено. Просто хочу знать, если использовать тупо си с классами (только ради архитектурных решений), будет ли такой подход уступать по скорости Си если тестировать алгоритмы большого объема на двух языках просто в одном случае будут обертки в классы.
Цитата Сообщение от DrOffset Посмотреть сообщение
то уж, будьте добры, сранивайте его с ООП-подходом на С
Это было бы некорректно. Мы же не обсуждаем эффективность парадигм, а эффективность работы программы.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
08.11.2016, 13:19 20
Цитата Сообщение от sys_beginner Посмотреть сообщение
Мы же не обсуждаем эффективность парадигм, а эффективность работы программы.
По аналоги: что лучше - вбить гвоздь молотком или ввинтить саморез отвёрткой, если нужно повесить картину.
Разные инструменты с разными подходами.

Почему, если С++, то сразу ООП? Степанов бы очень огорчился...
0
08.11.2016, 13:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2016, 13:19
Помогаю со студенческими работами здесь

Как сделать выбор цвета и выбор толщины кисти в MDI приложении?
Работаю с mdi приложениями в виде Paint, но не знаю кода что бы присваивать mdi приложению такие ...

Сделать выбор между двумя нетбуками по одной цене, но с разными преимуществами
Доброго времени суток форумчанам! Помогите выбрать нетбук: ...

Как сделать,у меня сервер обычная XP,как мне правильно сделать так,что бы некоторые компы отрезать от инета,но не от базы данных(К+ и 1С и т.п)
Система токая,инет идет на модем,с модема идет на хаб,с хаба на всех??? какой прогой лучше...

OpenFileDialog1 - Как убрать выбор директории, сделать её по умолчанию одну пример "C://cjkdsofj.sys" это выбор файла
Вопрос в шапке


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru