Что может C ++ сделать, что слишком сложно или грязно на любом другом языке? - PullRequest
28 голосов
/ 08 января 2009

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

Меня особенно интересуют аспекты C ++, которые мало известны или недостаточно используются.

Редактировать: Люди, пожалуйста, по крайней мере кратко прочитайте другие ответы, чтобы убедиться, что вы не дублируете то, что уже было сказано, если вы согласны с тем, что сказал кто-то другой, проголосуйте! 1007 *

Ответы [ 16 ]

52 голосов
/ 08 января 2009

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

Беспрепятственный доступ к API ОС .

37 голосов
/ 08 января 2009

Я остался с C ++, так как он по-прежнему самый высокопроизводительный язык общего назначения для приложений, которым необходимо сочетать эффективность и сложность. В качестве примера я пишу программное обеспечение для моделирования поверхностей в реальном времени для портативных устройств для геодезической отрасли. Учитывая ограниченные ресурсы, Java, C # и т. Д. Просто не обеспечивают необходимые характеристики производительности, в то время как языки более низкого уровня, такие как C, развиваются гораздо медленнее, учитывая более слабые характеристики абстракции. Диапазон уровней абстракции, доступных для разработчика на C ++, огромен, в одном крайнем случае я могу перегружать арифметические операторы, так что я могу сказать что-то вроде MaterialVolume = DesignSurface - GroundSurface , одновременно работая с несколькими различные кучи для наиболее эффективного управления памятью для моего приложения на определенном устройстве. Объедините это с множеством свободно доступных источников для решения практически любой распространенной проблемы, и у вас есть чертовски мощный язык разработки.

Является ли C ++ оптимальным решением для большинства проблем в большинстве областей? Вероятно, нет, хотя в крайнем случае он все еще может быть использован для большинства из них. Это все еще лучшее решение для эффективной разработки высокопроизводительных приложений? ИМХО без сомнения.

29 голосов
/ 08 января 2009

Стреляй себе в ногу.

Ни один другой язык не предлагает такой креативный набор инструментов. Указатели, множественное наследование, шаблоны, перегрузка операторов и препроцессор.

Удивительно мощный язык, который также предоставляет широкие возможности для стрельбы пешком.

Редактировать: Я прошу прощения, если моя неудачная попытка юмора обидела некоторых. Я считаю C ++ самым мощным языком, который я когда-либо использовал - со способностями кодировать на уровне ассемблера при желании и на высоком уровне абстракции при желании. C ++ был моим основным языком с начала 90-х годов.

Мой ответ основан на многолетнем опыте стрельбы себе в ногу. По крайней мере, C ++ позволяет мне делать это элегантно.

21 голосов
/ 08 января 2009

Детерминированное разрушение объекта приводит к некоторым великолепным шаблонам проектирования. Например, хотя RAII не является такой общей техникой, как сборка мусора, он приводит к некоторым впечатляющим возможностям, которые вы не можете получить с помощью GC.

C ++ также уникален тем, что в нем есть полный процессинг Тьюринга. Это позволяет вам предпочитать (как в отличие от отсрочки) множество задач кода для компиляции времени выполнения вместо времени выполнения. Например, в реальном коде у вас может быть оператор assert () для проверки на никогда не происходящее. Реальность такова, что это рано или поздно случится ... и произойдет в 3:00, когда вы в отпуске. Препроцессор C ++ assert выполняет тот же тест во время компиляции. Утверждения во время компиляции завершаются с 8:00 до 17:00, когда вы сидите перед компьютером и смотрите сборку кода; Утверждения во время выполнения терпят неудачу в 3:00, когда вы спите на Гавайях. Там довольно легко увидеть победу.

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

18 голосов
/ 08 января 2009

Запись встроенной сборки (MMX, SSE и т. Д.).

Детерминированное разрушение объекта. То есть настоящие деструкторы. Облегчает управление дефицитными ресурсами. Позволяет RAII.

Упрощенный доступ к структурированным двоичным данным. Проще преобразовать область памяти в структуру, чем анализировать ее и копировать каждое значение в структуру.

Множественное наследование. Не все можно сделать с помощью интерфейсов. Иногда вы тоже хотите наследовать реальную функциональность.

12 голосов
/ 08 января 2009

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

9 голосов
/ 08 января 2009

Абсолютный контроль над макетом памяти, выравниванием и доступом, когда вам это нужно. Если вы достаточно осторожны, вы можете написать несколько очень удобных для кэша программ. Для многопроцессорных программ вы также можете устранить множество замедлений из механизмов согласованности кэша.

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

9 голосов
/ 08 января 2009

Шаблонные миксины обеспечивают повторное использование, чего я не видел в другом месте. С их помощью вы можете создать большой объект с большим поведением, как если бы вы написали все вручную. Но все эти небольшие аспекты его функциональности можно использовать повторно, это особенно полезно для реализации частей интерфейса (или всего этого), где вы реализуете ряд интерфейсов. Результирующий объект молниеносен, потому что он весь встроенный.

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

6 голосов
/ 01 сентября 2009

Это, вероятно, не будет популярным ответом, но я думаю, что C ++ отличает его возможности во время компиляции, например шаблоны и #define. Вы можете выполнять любые виды обработки текста в своей программе, используя эти функции, большая часть которых была оставлена ​​в более поздних языках во имя простоты. Для меня это намного важнее, чем любое низкоуровневое переключение битов, которое предположительно проще или быстрее в C ++.

C #, например, не имеет реальной возможности макросов. Вы не можете #include другой файл непосредственно в исходный код, или использовать #define для управления программой в виде текста. Вспомните, когда вам приходилось механически печатать повторяющийся код, и вы знали, что есть лучший способ. Возможно, вы даже написали программу для генерации кода для вас. Ну, препроцессор C ++ автоматизирует все эти вещи.

Средство «дженериков» в C # также ограничено по сравнению с шаблонами C ++. C ++ позволяет применять оператор точки к типу шаблона T вслепую, вызывая (например) методы, которые могут не существовать, и проверки на корректность применяются только после того, как шаблон фактически применяется к определенному классу. Когда это произойдет, если все предположения, которые вы сделали относительно T, на самом деле верны, то ваш код скомпилируется. C # не допускает этого ... тип "T" в основном должен рассматриваться как объект, то есть с использованием только наименьшего общего знаменателя операций, доступных для всего (присваивание, GetHashCode (), Equals ()).

C # покончил с препроцессором и реальными обобщениями во имя простоты. К сожалению, когда я использую C #, я пытаюсь найти заменители этих конструкций C ++, которые неизбежно являются более раздутыми и многослойными, чем подход C ++. Например, я видел, как программисты обходили отсутствие #include несколькими раздутыми способами: динамически связывая с внешними сборками, переопределяя константы в нескольких местах (один файл на проект) или выбирая константы из базы данных и т. Д.

Как однажды сказала мисс Крэбпл из "Симпсона", это "довольно отстой, Милхаус".

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

Опять же, это, возможно, не самый популярный ответ - любой вводный текст на C ++ предупредит вас, например, о #define. Но, работая в течение многих лет с широким спектром языков и учитывая теорию, лежащую в основе всего этого, я думаю, что многие люди дают плохие советы. Похоже, это особенно относится к разведенному подполю, известному как «ИТ».

5 голосов
/ 08 января 2009

Передача структур POD через процессы с минимальными издержками. Другими словами, это позволяет нам легко обрабатывать двоичные объекты двоичных данных.

...