Вещи о C ++, которые заставляют программистов на C нервничать
Там много магии происходит под капотом; Конструкторы, деструкторы, виртуальные методы, шаблоны и т. д. могут сделать код на C ++ намного проще и быстрее писать, чем эквивалентный код на C, но труднее понять и объяснить (в зависимости от того, насколько хорошо вы знаете C ++ и связанные с ним соглашения). Нечто простое Foo newFoo;
может вызвать много кода в зависимости от того, как был определен конструктор для класса Foo
(и любых классов, от которых он зависит). По этой же причине соглашение заключается в записи, ++it
а не it++
при переборе контейнера, поскольку постфикс ++
часто включает в себя дорогостоящую операцию копирования.
В зависимости от того, что вы делаете, могут быть некоторые нетривиальные издержки, особенно для простых задач. Возьмите следующие две программы: первую на C, вторую на C ++:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
Идентичное поведение, не большая разница с точки зрения исходного кода, но в блоке SLES 10, над которым я работаю с gcc 4.1.2, первый генерирует исполняемый файл размером ~ 9 КБ, тогда как второй занимает более 12,5 КБ (без оптимизации ), почти на 28% больше. Тип C ++ string
намного легче работать с IMO, чем библиотека строк C, и потоки C ++ гораздо более гибкие и настраиваемые, чем потоки C, но для действительно мертвого кода, подобного этому, они, возможно, не стоят накладных расходов.
C ++ - огромный язык по сравнению с C, с очень сложной семантикой. Требуется гораздо больше времени, чтобы овладеть С ++, чем С, а это означает, что многие люди, которые утверждают, что знают С ++, не знают его так же хорошо, как думают.
Вещи о C, которые заставляют программистов на C ++ нервничать
C не является безопасным языком программирования для любой части воображения; никаких ограничений проверки на массивах не приводит к большому количеству уязвимостям поведения (будь то через ныне мертвой gets
функции, или через scanf
с %s
и %[
спецификаторов преобразования). C ++ по крайней мере дает вам контейнеры, которые выдают исключения, если вы пытаетесь получить доступ за пределами их определенного в настоящее время диапазона; все, что дает вам С, - это (если вам повезет) нарушение сегментации.
Управление памятью в C очень трудоемко и подвержено ошибкам по сравнению с инструментами, которые предоставляет C ++. Если вы строите свой собственный контейнер, вы несете ответственность за совмещая все malloc
и free
вызовы, убедившись , что распределения являются успешными, отступая любые частичные распределения в случае ошибки и т.д. В C ++, вы просто добавить элементы или удалить предметы из контейнера. Если есть проблема, будет выдано исключение.
Точно так же обработка ошибок в C - боль в заднице по сравнению с инструментами, которые предоставляет C ++ (а именно, исключения). Что действительно интересно, так это когда вы выделяете кучу памяти, а затем ударились о стену в процессе обработки; поскольку вы должны отступить, вы должны освободить эту память в правильном порядке. С принципами C ++ и RAII это (относительно) легко сделать.
Так, когда я использую один по другому?
Если то, что вы пишете, очень просто, прочитайте его / осмотрите его / избавьтесь от приложения, чье поведение может быть четко описано с точки зрения входов и выходов, а также с точки зрения производительности, тогда предпочитайте C над C ++. В противном случае предпочитаю C ++