HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Почему мы знаем С++, но пишем движки по-прежнему на "Си с классами"
aka "Почему Jackhammer так тормозит?"
Страницы (6): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Почему мы знаем С++, но пишем движки по-прежнему на "Си с классами"

Любопытная статья на тему "C vs C++"
http://eax.me/c-vs-cpp/

Особенно рекомендуется тем, кто не знает, чем С++ отличается от С. Вернее, знает по тому что пишут в учебниках - про то, что в С++ есть классы и инкапсуляция, а в С нет, ну короче вот это всё враньё.
Те, кто, например, знает, что сугубо классовый и инкапсулированный Direct3D можно свободно использовать в С, узнают/вспомнят из статьи, чем опасно использование С++ в реалтайм-программах типа игровых движков.
Ну а Jackhammer, в котором некоторые диалоги открываются по полсекунды, отлично иллюстрирует, во что это в итоге выливается. И если редактору это ещё можно простить, то движку - уже нет.

А я, в свою очередь, который уже год при разработке Volatile балансирую на острие ножа - с одной стороны, пытаясь совмещать фичи С++, упрощающие написание, compile-time проверку, понимание и поддержку кода, с простотой, производительностью и низкоуровневым доступом (там где он нужен) языка С. Но, конечно, мало кто это в итоге оценит - народу куда важнее красочные шейдеры.

Личный опыт по теме всячески приветствуется.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156755

Старое сообщение 18-07-2016 06:33
-
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



XaeroX
Ты читал Ben Klemens 21st Century C? Если читал, что про неё скажешь?
Там довольно доступная глава как раз про реализацию ООП-фишек в ANSI C.

Сообщить модератору | | IP: Записан
Сообщение: 156757

Старое сообщение 18-07-2016 11:00
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


nemyax
Неа, не читал. Поделишься ссылкой на эту главу?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156759

Старое сообщение 18-07-2016 11:05
-
GioHAUS0n
Житель форума
Девойс

Дата регистрации: Feb 2013
Проживает: N/A
Сообщений: 660

Рейтинг



Лучше работать на старом движке, чем на новом. Ту же самую дилемму приперли сюда, что лучше, кто хуже. Оба хуже - это однозначно. Лучших никогда не бывает. Приходится искать компромисс, между тем или иным, а не сравнивать как тупой блогекомментартор из yt или vk или fb.

http://www.codenet.ru/progr/cpp/ccpp.php
http://www.linux.org.ru/forum/development/311369
https://habrahabr.ru/post/262461/
http://www.cyberforum.ru/holywars/thread46728.html
https://toster.ru/q/125143

Сообщить модератору | | IP: Записан
Сообщение: 156760

Старое сообщение 18-07-2016 11:09
- За что?
Cybermax
Житель форума

Дата регистрации: May 2006
Проживает: ㅤ
Сообщений: 5126

Рейтинг



Авторов Мадженты мнение услышать было бы любопытно.

Сообщить модератору | | IP: Записан
Сообщение: 156761

Старое сообщение 18-07-2016 11:12
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Цитата:
GioHAUS0n писал:
Лучше работать на старом движке, чем на новом.

C11 сложно назвать старым.

Сообщить модератору | | IP: Записан
Сообщение: 156762

Старое сообщение 18-07-2016 11:57
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Блог вроде интересный, добавил в закладки

Цитата:
Однако большинство людей под С++ понимают так называемый «современный C++», со счетчиками ссылок, классами, исключениями, шаблонами, лямбдами, STL, Boost, и так далее. То есть, тот C++, на котором вы пишите, почти как на Java, в котором никогда не встречаются обычные указатели, и вот это все. Если вам очень важна скорость, то писать на таком C++ вы не сможете. Если же он вам подходит, то лучше взять Java, Go или любой другой высокоуровневый язык по вкусу.


Т.е. тем, кто хочет писать код с шаблонами и исключениями, автор предлагает использовать язык, в котором нет ни того, ни другого? (это про Go)

В зависимости от задачи, может пригодиться разное подмножество C++, нужно просто уметь выбирать и не тащить всё подряд. Я думаю, для задач алгоритмических, C++ с шаблонами подходит (но без ООП головного мозга). В самом деле, не реализовывать же для каждого типа quicksort, ассоциативные и динамические массивы. Мне, признаться, не особо понравилось этим заниматься, когда я писал курсовую, где требованием было писать на Си, ибо по сути пришлось дублировать код.

В комментах к статье вот упомянули Eigen, который может посоревноваться с blas засчёт того, что работает с матрицами на уровне целых выражений.

RAII очень уместен тогда, когда время жизни ресурса заранее известно. Нет никакого удовольствия в goto Error; или дублировании кода очистки во всех точках выхода. Умный указатель на каждый чих - конечно плохая практика, но такой стиль и не является рекомендуемым. Тут я бы хотел упомянуть про такую фичу языка D как scope(exit), которая позволяет писать вот такой код:

code:
void func() { FILE* file = fopen(....); scope(exit) fclose(file); //do stuff. }


Никаких оберток, ни конструкторов, ни деструкторов. В Си есть подобная штука, но только как расширение компиляторов.

Если бы в Си были шаблоны и подобный RAII (но закрепленный в стандарте), то надобность в C++ может быть и вовсе отпала. Что до ООП, то его при надобности можно и на Си писать.

Остаются ещё исключения - штука настолько спорная, что даже в стандартной библиотеке C++ так и не решили, нужно их кидать или нет, из чего родилась функция std::ios::exceptions. Для меня большим минусом исключений является то, что они не являются частью объявления функции. Соответственно, не знаешь чего ожидать. А когда в дело вступают наследование и шаблоны, всё становится ещё мутнее.

Сообщить модератору | | IP: Записан
Сообщение: 156763

Старое сообщение 18-07-2016 18:30
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
Т.е. тем, кто хочет писать код с шаблонами и исключениями, автор предлагает использовать язык, в котором нет ни того, ни другого?

Он предлагает Java.
Java - как Греция, там всё есть.
Цитата:
FreeSlave писал:
В самом деле, не реализовывать же для каждого типа quicksort, ассоциативные и динамические массивы.

В смысле? Зачем ассоциативные массивы для quicksort?
Цитата:
FreeSlave писал:

RAII очень уместен тогда, когда время жизни ресурса заранее известно.

В си можно реализовать RAII и без gcc-шных расширений. Через динамический массив структур, хранящих адреса и деструкторы, с соответствующими вызовами-обёртками. Иплементацию в последнем случае можно скрыть, чтобы не мозолила глаза. Но выглядеть после С++ будет, разумеется, довольно дико и непривычно.
Цитата:
FreeSlave писал:
Остаются ещё исключения - штука настолько спорная

Есть же raise/signal? Или важен именно факт передачи доп. информации в виде объекта исключения?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156765

Старое сообщение 18-07-2016 18:46
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Цитата:
XaeroX писал:
В смысле? Зачем ассоциативные массивы для quicksort?

Не знаю. Я о таком и не писал.

XaeroX, о каком raise речь? А если под signals имеются в виду POSIX-сигналы, то у них же и назначение иное.

Я наверно не совсем внятно выразился. Я не считаю, что наличие исключений, обязательно для "улучшенного" Си. Наоборот, выразил свою неуверенность в этом вопросе.

Сообщить модератору | | IP: Записан
Сообщение: 156766

Старое сообщение 18-07-2016 19:12
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
Не знаю. Я о таком и не писал

Цитата:
FreeSlave писал:
В самом деле, не реализовывать же для каждого типа quicksort, ассоциативные и динамические массивы.

Извини, видимо, не заметил запятую и прочитал совсем другое по смыслу.
Но я не вижу проблемы делать шаблоны на С - с использованием "магического" типа void*. Та же qsort так реализована и работает с любыми типами (при условии последовательности и непрерывности области памяти). Имхо, единственное достоинство шаблонов С++ - это compile-time проверки.
Цитата:
FreeSlave писал:
А если под signals имеются в виду POSIX-сигналы, то у них же и назначение иное.

Ну там можно и свои.
Ещё есть вариант с setjmp/longjmp.
Ну MS-specific __try/__except/__finally.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156767

Старое сообщение 18-07-2016 19:23
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Цитата:
XaeroX писал:
Но я не вижу проблемы делать шаблоны на С - с использованием "магического" типа void*. Та же qsort так реализована и работает с любыми типами


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

Сообщить модератору | | IP: Записан
Сообщение: 156768

Старое сообщение 18-07-2016 19:31
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Цитата:
FreeSlave писал:
Шаблоны позволяют сгенерировать нужный код без таких жертв.

Можно ведь в простых случаях и макросами обойтись.

Сообщить модератору | | IP: Записан
Сообщение: 156769

Старое сообщение 18-07-2016 19:44
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
Но это подразумевает лишние разыменования, как указателя на функцию, так и данных по указателю на void. В контексте производительности это не очень хорошо.

Зато это удобно в случае, если есть арифметика указателей - например, выполнение однотипных операций с массивом. Указатель уже есть. В цикле в любом случае были бы разыменования.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156770

Старое сообщение 18-07-2016 20:41
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



За попытки переложить менеджмент памяти на сторонние библиотеки, умные указатели и встроенные средства языка погромисту надо отрубать руки. Память надо уметь выделять самому. Хапнул большой кусок и вручную там разместил всё нужное. А потом удалил за один вызов. Вот как надо.
Тогда фргаментация стремится к нулю.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 156799

Старое сообщение 19-07-2016 18:34
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
Вот как надо.

Или мемклумпинг.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 156800

Старое сообщение 19-07-2016 18:42
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 07:03. Новая тема    Ответить
Страницы (6): [1] 2 3 4 5 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Почему мы знаем С++, но пишем движки по-прежнему на "Си с классами"
aka "Почему Jackhammer так тормозит?"
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024