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

StackOverflow https://stackoverflow.com/questions/423335

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Беспрепятственный доступ к API-интерфейсам ОС .

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

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

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

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

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

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

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

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

Написать встроенную сборку (MMX, SSE и т. д.).

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

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

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

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

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

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

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

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

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

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

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

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

Как ср.Крэбэппл из The Simpson's однажды сказал: "это довольно убого, Милхаус".

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

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

Технически, я думаю, что нет, правда!

Честно говоря, я не думаю, что C ++ может что-то сделать, что Язык D не может. Независимо от того, какие способности есть у C ++, они всегда сложнее и сложнее, чем D или любой другой язык. Даже простая вещь, такая как объявление класса, в C ++ намного сложнее и сложнее, чем в любом другом языке.

Единственное, что может сделать C ++, - это быть совместимым с миллионами строк кода, уже написанных на C ++.
Это единственное, что не может сделать ни один язык, кроме C ++:)

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

C # и Java вынуждают вас поместить функцию 'main ()' в класс. Я нахожу это странным, потому что это разбавляет значение класса.

Для меня класс - это категория объектов в вашей проблемной области. Программа не такой объект. Поэтому в вашей программе никогда не должно быть класса «Program». Это было бы эквивалентно математическому доказательству, использующему символ для обозначения себя - доказательство - рядом с символами, представляющими математические объекты. Это будет просто странно и непоследовательно.

К счастью, в отличие от C # и Java, C ++ поддерживает глобальные функции. Это позволяет вашей функции main () существовать снаружи. Поэтому C ++ предлагает более простую, более согласованную и, возможно, более правдивую реализацию объектно-ориентированной идиомы. Следовательно, это одна вещь, которую может сделать C ++, но C # и Java не могут.

Я думаю, что перегрузка операторов - довольно приятная особенность. Конечно, этим можно злоупотреблять (как в Boost lambda).

Строгий контроль над системными ресурсами (особенно памятью), предлагая при этом мощные механизмы абстракции. Единственный язык, который я знаю, который может приблизиться к C ++ в этом отношении, это Ada.

C ++ обеспечивает полный контроль над памятью и, как результат, делает процесс выполнения программы намного более предсказуемым. Вы можете не только точно сказать, в какое время происходит выделение и освобождение памяти, вы можете определить свои собственные кучи, иметь несколько куч для разных целей и точно сказать, где в памяти выделяются данные. Это часто полезно при программировании на встроенные системы / системы реального времени, такие как игровые приставки, мобильные телефоны, mp3-плееры и т. Д., Которые:

<Ол>
  • имеют строгие верхние пределы памяти, которые легко доступны (по сравнению с ПК, который становится все медленнее, когда у вас заканчивается физическая память)
  • часто имеют неоднородную структуру памяти. Вы можете разместить объекты одного типа в одном фрагменте физической памяти, а объекты другого типа - в другом.
  • имеют ограничения программирования в реальном времени. Неожиданный вызов сборщика мусора в неподходящее время может привести к катастрофическим последствиям.
  • AFAIK, C и C ++ - единственный разумный вариант для подобных вещей.

    Если честно, вы можете делать что угодно, если хотите писать достаточно кода.

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

    Есть вещи, которые оболочки C ++ упрощают (поскольку они могут читать файлы заголовков), например, разработка Office. Но опять же, это потому, что кто-то написал много кода для " обернуть " это для вас в RCW или "Runtime Callable Wrapper"

    РЕДАКТИРОВАТЬ: Вы также понимаете, что это загруженный вопрос.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top