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

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

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

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

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

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

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

Подскажите как правильно сделать - C++
Нужно добавить К столбцов в начало матрицы, я сделала но добавление в конец, не подскажете как добавить в начало ...

Подскажите как правильно сделать - C++
Нужно добавить К столбцов в начало матрицы, добавлять оно добавляться но оно берет память левую, выходит за приделы массива, не могу...

Как правильно сделать сортировку? - C++
Никак не получается отсортировать так, чтобы сначала сортировались люди военнообязанные и по году рождения, а затем невоеннообязанные. ...

Подскажите как правильно сделать - C++
Помогите пожалуйста нужно отсортировать четные элементы массива а не четные оставить на своих местах. Например ввожу 14 52 6 8 4 ---— 1...

Как правильно сделать список - C++
#include <iostream> #include <windows.h> struct BList{ PWCHAR fullName; PWCHAR name; PWCHAR hash; BList *next; ...

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

Короче, как научишься, такой код и будешь писать.
1
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 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 секунды
Но получается хорошая структура
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,019
08.11.2016, 10:50 #4
Цитата Сообщение от nonedark2008 Посмотреть сообщение
без каких-либо потерь производительности.
А Страуструп обещал падение в среднем не более, чем на 4%.
Однако стоит понимать, что С и С++ совершенно разные языки с разной идеологией и подходами. И в С++ гораздо больше средств написать более безопасный код. А также сократить количество строк кода, что (очень) грубо говоря, линейно отразиться на количестве ошибок в коде, а значит и скорости.

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

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

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

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

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

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

Добавлено через 26 секунд
И конечно же использование template-ов
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
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
GbaLog-
Любитель чаепитий
2899 / 1356 / 333
Регистрация: 24.08.2014
Сообщений: 4,799
Записей в блоге: 1
Завершенные тесты: 2
08.11.2016, 11:13 #7
Цитата Сообщение от sys_beginner Посмотреть сообщение
ООП без потери производительности в сравнении с Си
В Си нет встроенного ООП, а если его эмулировать, то смотрится это, мягко говоря, не очень.
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
0
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
08.11.2016, 11:19  [ТС] #8
Цитата Сообщение от GbaLog- Посмотреть сообщение
Виртуальные функции требуют хранить указатель на базовый класс и вызов виртуальной функции базового класса обходится дороже, чем вызов обычного метода класса, т.к. приходится переходить ещё и по указателю, чтобы вызвать эту функцию.
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
08.11.2016, 11:21 #9
Цитата Сообщение от sys_beginner Посмотреть сообщение
наоборот же virtual нужен для того что бы вызывать метод именно того класса объект которого используется(а не базового)
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
0
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
08.11.2016, 11:30  [ТС] #10
Цитата Сообщение от Renji Посмотреть сообщение
Но вам вроде бы никто не мешает пользоваться плюшками даваемыми синтаксисом плюсов (хоть той же перегрузкой имен), избегая не очень быстрых плюсовых потоков.
Т.е работы с потоками использовать сишные функции вместо std::что-то там?
Цитата Сообщение от Renji Посмотреть сообщение
К примеру, у сишных строк размер фиксирован, а значит есть риск что этот самый размер внезапно кончится.
Есть же malloc/realloc

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

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Ну так реализуется то это все равно через указатель на метод. Просто, этот указатель упрятан под капот.
Так и в си вроде через указатели
http://rextester.com/VVL13734
В примере создан указатель на функцию, которому присваивается имя функции без взятия явного адреса и ошибок не происходит
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
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
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
08.11.2016, 11:54  [ТС] #12
Renji,
Ясно. Спасибо!

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
что в этом случае можете сказать?
Тогда стоит смотреть на другие характеристики кода. Это опять же, зависит от задачи. Кто-то пишет программы запуска ракет, а кто-то курсач сдаёт.
1
Undisputed
162 / 93 / 19
Регистрация: 10.06.2014
Сообщений: 1,303
Завершенные тесты: 3
08.11.2016, 12:06  [ТС] #14
Цитата Сообщение от MrGluck Посмотреть сообщение
Например, в С++ есть средства, соответствующих идиоме RAII. Таким образом, меньше вероятность утечки данных. И есть много средств, заменяющих магию с побитовыми операциями или работе с сырой памятью.
Ну тут скорее всего все основано в страховании от ошибок при разработке и многое сделано уже за разработчика и очень эффективно, да?
Цитата Сообщение от MrGluck Посмотреть сообщение
Но обсуждать выбор без конкретной задачи бессмысленно, однако стоит заметить, что у плюсов есть выбор.
Не пойму, зачем нужна конкретная задача, если мы обсуждаем эффективность инструментов. Ведь программа не знает чем она является, запускателем ракет или чем то другим. А если бы и знала, она бы не "испугалась и начала работать быстрее только потому что запускает ракеты"
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,808
08.11.2016, 12:09 #15
Цитата Сообщение от sys_beginner Посмотреть сообщение
Кстати в Си тоже можно сделать универсальность в работе с потоками приводя их явно к FILE (не уверен, что для всех потоков).
Если вы про "приведение" вида FILE(str), то это трюк серии "возьмем зайца и запишем в документы как медведя". Даже если Си позволяет записать зайца как в медведя, этот заяц ульи с медом разорять не начнет.
И вообще, сишный аналог stringstream, это обычная сишная строка, которую заполняют snprintf. Понятное дело, к файлам она никакого отношения не имеет.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2016, 12:09
Привет! Вот еще темы с ответами:

Как лучше это сделать?. а главное, как правильно? (Информационная система «Железнодорожный вокзал») - C++
Ситуация следующая... Есть задание курсовой работы: 11. Информационная система «Железнодорожный вокзал». Информация: рейсы — номер...

Как правильно сделать функцию? (Из Паскаля в С++) - C++
Добрый день, уважаемые программисты! Подскажите пожалуйста вот такое дело: есть код на Турбопаскале, и надо всё это дело в С++. ...

Неккоректность типов.Как правильно сделать? - C++
Приветствую вас уважаемые! Отличный форум,много полезного.) Сразу к делу. Нужен цикл,который выводит послдовательность символов в COM...

Включение, как правильно сделать инициализацию - C++
Вот код: #ifndef WINE_H_ #define WINE_H_ #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;valarray&gt; template&lt;typename T1,...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
08.11.2016, 12:09
Ответ Создать тему
Опции темы

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