Я занимаюсь разработкой эмулятора NES в свободное время. Я использую C ++, потому что это язык, который я использую в основном, знаю в основном и нравится в основном.
Но теперь, когда я продвинулся в проекте, я понял, что не использую почти никаких специфических возможностей C ++, и мог бы сделать это на простом C и получить тот же результат. Я не использую шаблоны, перегрузку операторов, полиморфизм, наследование. Так что бы вы сказали? я должен остаться в C ++ или переписать его в C?
Я не буду делать это для повышения производительности, это может быть побочным эффектом, но идея в том, зачем мне использовать C ++, если он мне не нужен?
Единственные возможности C ++, которые я использую, - это классы для инкапсуляции данных и методов, но это можно сделать и с помощью структур и функций, я использую new и delete, но могу также использовать malloc и free, и я использование наследования только для обратных вызовов, что может быть достигнуто с помощью указателей на функции.
Помните, это хобби-проект, у меня нет сроков, поэтому время и работа, которые потребуют переписывания, не являются проблемой, а также могут быть интересными. Итак, вопрос в C или C ++?
I use C++ because is the language I use mostly, know mostly and like mostly.
И это ответ на ваш вопрос. Вы должны переключать языки только в середине проекта, когда есть проблема, которую ваш текущий язык не может решить.I don't use templates, operator overloading, polymorphism, inheritance.
Изучать и использовать концепции гораздо полезнее, чем переходить на C. Поскольку это хобби-проект, почему бы не использовать несколько вещей, которые вы раньше не использовали? Вы всегда можете запустить другой проект на C и выучить язык, но для вашего текущего проекта переключать не имеет смысла.std::shared_ptr
,std::unique_ptr
,boost::scoped_ptr
,std::vector
,std::deque
,std::map
и т.д. Для функции обратного вызова, вид в использование функторов, и в C ++ 11, вам Можно также начать использовать такие вещи, как лямбда-функции.Ответы:
Вы не используете его сейчас, но в следующий раз, когда вы потеряете память или получите двойное удаление, вы будете просить вернуться
std::vector<T>
,std::unique_ptr<T, Del>
иstd::shared_ptr<T>
, что может решить эти проблемы легко - почти тривиально. Это то, что происходит со всеми, кто использует C над C ++, в конце концов, и самые умные просто не ждут появления ошибок, прежде чем переходить.Код, который использует
new
иdelete
непосредственно не принадлежит C ++, он принадлежит к той половине дома, которую мы называем «C с классами». Вот где язык был примерно в 1985 году. Он не особенно похож на C ++, примерно в 2011 году. По всей вероятности, где бы вы ни изучали C ++, он просто не учил этому очень хорошо - что, к сожалению, довольно распространено - и с лучшим образованием, вы бы найти использование этих функций.В частности, как я перечислил выше, общие структуры данных C ++ и классы управления ресурсами просто существенно превосходят все, что может предложить C. Если вы хотите динамически распределенный массив, используйте
std::vector<T>
. Это довольно распространенный вариант использования. Если вы их не используете, то ваш код подвергается огромному риску ошибок, особенно связанных с управлением ресурсами. C ++ может гарантировать безопасность и повторно использовать код таким образом, что C никогда не сможет коснуться.Тем не менее, я думаю, что вы также можете ожидать слишком многого. Написание шаблонов и перегрузок операторов не характерно для пользователей библиотек. Если ваш код использует
std::vector<T>
, вам не нужно писать шаблон, чтобы это произошло. Если ваш код используетstd::string
, никто не заставляет вас перегружать операторов. Вам нужно только написать эти вещиstd::vector<T>
иstd::string
- но вы все равно можете в полной мере воспользоваться ими.Полиморфизм / наследование также имеет только конкретный вариант использования. Если ваш код не требует от вас написания каких-либо шаблонов или использования виртуальных функций, то это не так, и есть программы или сегменты программ, в которых вам не нужно писать свои собственные шаблоны.
Кроме того, в C нет никакого выигрыша в производительности по сравнению с C ++.
источник
make_shared
существует, и вы можете написать простойmake_unique
шаблон, который выполняет ту же работу. Это безопаснее.make_shared
это более эффективно. Только заводские функции могут обеспечить гарантированную безопасность исключений.Даже если вы не используете специфичные для C ++ функции, компилятор C ++ обнаружит больше проблем, чем компилятор C из-за более строгой системы типов C ++.
источник
Я бы посмотрел на это с другой стороны. Вы получаете что - либо путем переписывания кода в C? Даже в чисто хобби-проекте есть такая стоимость, связанная с переписыванием. Если ничто иное, как я полагаю, будет называться альтернативной стоимостью, т. Е. Другими вещами, которые вы могли бы сделать за это время, если бы не
тратили свое время напереписывание этого в C.Итог: если вы не думаете, что код действительно может быть использован в какой-то среде, где доступ к C ++ действительно ограничен (или отсутствует), в лучшем случае это будет бессмысленная трата времени. По крайней мере, по моему опыту, это очень быстро выходит за рамки этого - вспоминая код, который я написал на C ++, который нужно было преобразовать в C, я могу довольно ясно помнить, что даже во многих случаях это казалось это должно быть тривиально, я использовал гораздо больше функций, специфичных для C ++, чем я изначально предполагал. Чтобы иметь большую надежду на то, что он будет полезен, вам, скорее всего, придется ориентироваться на C89 / 90, и в этом случае вам быстро напомнят о таких вещах, как определение всех переменных в начале блока вместо того, где они на самом деле используемый.
Короче говоря, если вы не уверены, что переписывание на С принесет реальную выгоду, почти неизбежно есть куда более полезные вещи.
источник
Как более общий ответ:
Не переключайтесь на C ++ только потому, что вы используете некоторые из его более уникальных функций. Однажды вам могут понадобиться эти функции, и вы просто будете бить себя по голове, потому что вы используете C.
источник
Что касается развития хобби, я бы подумал о том, чтобы вернуться к обычному языку C. С и C-подобные языки с большей вероятностью будут поддерживаться в крошечных модулях разработки хобби.
Многие из ответов здесь могут быть от профессиональных типов программного обеспечения. Как любитель, вы не будете программировать постоянно или постоянно. Так что подумайте, на каком языке вы с большей вероятностью запомните или забудете причуды, если вы составляете свой проект в течение года, а затем возвращаетесь и пытаетесь прочитать свой код после того, как вы стали ржавым в коде. C ++, имеющий более богатый набор функций, может занять больше или меньше времени для повторного получения, в зависимости от вашего стиля кодирования.
источник
Ответить на ваши вопросы нелегко, так как мы не знаем, работаете ли вы над проектом, чтобы улучшить свои языковые навыки (C против C ++) или улучшить другие навыки программирования (дизайн, решение проблем и т. Д.).
«Единственные возможности C ++, которые я использую, - это классы для инкапсуляции данных и методов, но это можно сделать и с помощью структур и функций». Это неправда.
structs
в C не поддерживают инкапсуляцию и не могут содержать функции (методы) - по крайней мере, без использования методов, таких как указатели на функции. Кроме того, функции в C слабее, потому что они не могут быть перегружены.«Я использую new и delete, но могу также использовать malloc и free, и я использую наследование только для обратных вызовов, что может быть достигнуто с помощью указателей на функции». Как упоминалось в deadmg, использование напрямую
new
иdelete
в C ++ не рекомендуется. Кроме того, IMHO (и GoF) наследование в ООП следует отдавать предпочтение перед композицией, только когда требуется полиморфизм. И я не думаю, что достичь полиморфизма (позднего связывания) в Си тривиально, используя указатели на функции.Кроме этого, я не буду пытаться убедить вас, что C ++ "лучше", чем C, потому что это вопрос предпочтений, и он всегда зависит от проблемы, которую вы пытаетесь решить (использование функций ООП для разработки вашего эмулятора NES может быть хорошая идея).
источник
structs
на самом деле C может использоваться для инкапсуляции методов. Вы просто создаете структуру указателей на функции и инициализируете их так, чтобы они указывали на те функции, которые вы хотите. Для примера посмотрите lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 .printf
), но при этом вы потеряете любую проверку типов. Невозможно иметь конечный набор приемлемых объявлений: это либо 1 (и вы получаете проверку типов), либо «многие» (и потеря всей проверки типов на большой личный риск). Как и большинство вещей в C, это возможно, но часто неудобно.Я очень новичок, так что вот мои 2 бита.
Я изучаю C и C ++ на Wibit.net с некоторыми хорошими базовыми видеоуроками, может быть, они могут вам очень помочь в обзоре ситуации (не в рекламе!)
Я советую вам перейти на C, просто чтобы узнать, как вы любитель, это будет удовольствие, а не проблема.
Я советую больше. Сделайте это на обоих языках. Сравните способ и решения, которые вы найдете и используете. Я уверен, что это будет не так просто, как вы ожидаете ... но вы наверняка многому научитесь!
источник
Вот плюсы и минусы C ++ против C:
источник