Re: Visual C# vs C++. Надо сравнить перспективы.
От: bazis1 Канада  
Дата: 27.12.16 20:34
Оценка: +7 -1
Здравствуйте, Alexey.Os, Вы писали:

AO>Я пытаюсь собрать информацию, оценить ”минусы” и “плюсы” и сравнить перспективу.

Если нужен кроссплатформенный GUI, то C++ и Qt. Но по времени выйдет в 3 раза дольше, чем на WPF.
Если ПО не завязано на супермегавычисления, то однозначно C#. В разы больше вещей, которые за Вас делает компилятор и .Net runtime и о которых не надо думать.
Если супермегавычисления (и хитрая оптимизация по памяти) нужны, то я бы сделал ядро на C++, а GUI и некритичные по ресурсам вещи — на C#. По трудозатратам выйдет огромная экономия.

AO>Например, C# требует .NET. Что здесь хорошего, а что плохого?

AO>Какие еще ключевые отличия C++ от C# ?
Плюсы плюсов:
* Кроссплатформенность (в т.ч. GUI с Qt). C# сносно работает на Linux и Mac, но с GUI там большие проблемы.
* При желании можно выжать из железа максимум производительности. Скажем, поиск по многогигабайтной хэш-таблице, сохраненной в файле, без чтения всего файла в память, элементарно делается на C++ и жутко коряво выглядит на C# (с десятками вызовов BitConverter-а). Можно альтернативно использовать unsafe, но там есть свои тонкости.
* Требует существенно меньше памяти
Минусы плюсов:
* Нет нормального garbage collector-а. Поэтому нужно постоянно держать в голове, что и когда удаляется. Всякие shared_ptr и т.п. частично эту проблему решают, но держать это в голове все равно придется. Простейший пример на C#:
myEventSource.LineReceived += myHandler.HandleLineReceived;
myEventSource.DoSomethingInBackround();

2 объекта, первый делает что-то в фоне, второй подписан на его события. Оба удалятся автоматически, когда станут не нужны.
На C++ вы тут же упретесь в то, что:
а) Нельзя просто так взять указатель на метод и автоматически увеличить reference count для объекта. Можно, используя шаблонную магию, но вы замучаетесь.
б) Если myHandler держит ссылку на myEventSource, то получается circular reference. Надо разруливать руками: или делать weak reference, или shutdown() который сбросит (опять же руками) всякие вспомогательные smart-указатели.
* Меньше синтаксического сахара. К примеру, вот такая строчка в C#
return m_Something?.SomethingElse?.SubSomething ?? "empty";

на C++ занимает в 3 раза больше места:
if (!m_Something || !m_Something->SomethingElse || !m_Something->SomethingElse->SubSomething)
    return "empty";
return m_Something->SomethingElse->SubSomething;

и таких примеров много. Соответственно, одинаковый по функционалу код получается более громоздким и дорогим в поддержке.
* Нет reflection. В C# я могу объявить вот такую структуру:
struct MyStruct
{
    int Score;
    string[] Names;
}

и вызовом одного метода сбросить ее в XML:
<MyStruct>
   <Score>123</Score>
   <Names>
      <string>Alice</string>
      <string>Bob</string>
   </Names>
</MyStruct>

Это позволяет эффективно разделять алгоритмы и данные, сохраняя всякие настройки, policy, и т.п. в легкочитаемой форме, которую можно зачекинить в git. Более того, форма не привязана к порядку и размеру полей внутри структур, т.е. добавив в середину новое поле, я не сломаю сохраненные файлы.
* Нет yield return, async/await, LINQ и прочих вещей, которые часто экономят сотни строк кода.
* Существенно дольше компиляция, если Вы часто редактируете header-ы. Можно частично побороть через precompiled headers, но все равно будет медленно.

Как-то так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.