Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В C# массив — ссылочный тип. Поэтому без проблем можно передавать в любую функцию. В C++ все контейнеры ведут себя как «размерные» типы и копируют все содержимое при передаче в качестве параметра. Нужно очень внимательно писать код для C++, чтобы не копировать лишний раз массивы. Зачастую придется прибегать к умным указателям, которые несут дополнительный оверхед.
Достаточно пару сотен раз обжечься и проблема забытой ссылки пропадает сама собой.
Достаточно пару сотен раз обжечься и проблема забытой ссылки пропадает сама собой.
Скажу больше, сейчас у меня в проекте около полутора тысяч файлов, при этом new и delete используются буквально в десятке из них.Понятно, вы не испытываете проблем с управлением памятью в куче, потому что ваш codestyle подразумевает отказ от выделения памяти в куче. Ну так, с этого и следовало начинать. А если человек не хочет ни в чём себя ограничивать, и не хочет заниматься лишним рутинным трудом, предпочитая автоматизацию? Ну и да, в этой рутине тоже можно допустить ошибку.
Опытный программист просто физически не сможет написать код с вышеозвученными проблемами, потому что подсознание спать не даст, пока не исправишь эту ошибку.На эту тему я уже высказался. Можно лазать по деревьям и гордиться своим умением не наступать на тонкие ветки и не будить спящих на дереве змей, а можно сбить фрукт палкой-копалкой. Вы же почему то высказываетесь против палки-копалки. Ваша позиция: «Будь мужиком — лезь на дерево. Не умеешь лазать по дереву — не мужик». Тут абсолютно неважно, умеет ли человек, пользующийся палкой-копалкой, не будить спящих змей на дереве. Важно, что вы выступаете против прогресса.
я называл студентами и второстепенными программистами тех, кто не может поставить символ & и делает из этого трагедию
Как там может быть детерминированное освобождение ресурсов, если там сборщик мусора?А по вашему закрытие файлов и соединений (connection) можно сборщику мусора доверить? Такие ресурсы нужно как можно раньше освобождать.
Теперь вдвойне забавно выглядят крики о нудном создании деструкторов в плюсах.Финализаторы в С# не занимаются непосредственным освобождением памяти в куче. Да и используют их довольно редко.
Как там может быть детерминированное освобождение ресурсов, если там сборщик мусора?
class DeterministicResource: IDisposable
{
void IDisposable.Dispose()
{
//освобождаем ресурсы
}
}
using(var r = new DeterministicResource())
{
//делаем что нам надо с ресурсом
}
using (причем покинули любым способом — просто вышли за границу, сделали return, бросили exception), компилятор C# гарантирует вызов метода Dispose. Вторая прелесть в том, что если мы при этом используем только управляемые ресурсы, то если вызова Dispose не произойдет (например, пользователю класса не важное детерминированное поведение), ресурсы все равно будут собраны, просто позже.Про деструкторы — спасибо. Теперь вдвойне забавно выглядят крики о нудном создании деструкторов в плюсах.
Выделил память, сразу же напиши код её освобождения.Если у вас объект создаётся в куче через фабрику, то для соблюдения этого принципа у вас используются менеджеры объектов, как я понял с ваших слов. Эти менеджеры объектов надо как-то оповещать, чтобы они поняли, что пора сделать delete. Создание менеджера и его оповещение — это дополнительные приседания. Опять таки создание объектов в куче у вас наверное не всегда через фабрику делается. Если всегда, то пложение фабрик где надо и не надо — опять таки дополнительные приседания, ну или в чём то вы себя всё же ограничиваете в плане использования кучи.
Деструкторы нужны НЕ для того, чтобы вызвать в них delete.А если в конструкторе был выделен массив в куче, то где прикажете его освобождать? Отдельную функцию завести? И в чём выгода, почему не в деструкторе?
А ещё можно передавать по значению, но при этом копирования объекта не будетЧто? Передача по значению происходит путём копирования полей объекта в стек. Если изменение переданного по значению параметра приводит к изменению исходного объекта, значит одно из полей объекта — указатель, и вы изменили память по этому указателю. Но даже этот указатель копируется. Если вы в функции этому указателю присвоите новый адрес, то в исходном объекте адрес указателя не изменится.
Я не знаю, есть ли в C# деструкторы, если нет, то пичалька, придётся каждый раз в блок finally писать код, который можно один раз в деструктор написать.Не сомневаюсь, что столь опытный программист, коим вы себя позиционируете, сможет справиться с этой проблемой, не занимаясь дублированием кода.
Да, С++ и так может, потому и компилируется код долго, что он много чего может.Вы уверены, что дело в богатстве возможностей языка, а не в компиляторе? Кстати, C# тоже умеет много чего, чего не умеет С++: рефлексия, динамическая кодогенерация, динамик прокси (на основе кодогенерации), мок-объекты (на основе динамик-прокси)
vector и никаких куч
придётся каждый раз в блок finally писать код, который можно один раз в деструктор написатьСтандартное средство борьбы с дублированием кода — вынесение дублирующегося фрагмента в отдельную сущность. От языка практически не зависит.
С++ тоже это всё умеет. Только это придётся самому запрограммировать…И как это вы интересно будете делать рефлексию? Проанализируете программой собственные бинарные коды, взятые из оперативки? Во-первых, тут уже используется не столько С++, сколько знание ассемблера и машинных кодов. Во-вторых, даже зная особенности работы всех сишных компиляторов, вы вряд ли всегда сможете однозначно обнаружить все классы и их методы — из-за оптимизации, обфускации, ассемблерных вставок, возможности создания нового компилятора и т.п.
И вектор хранит свои элементы в куче.
Почему в Шарпе можно дописывать аттрибуты и свойства и всякое разное, чтобы включить поддержку какой-нибудь рефлексии,
Раз в С++ до сих пор нет рефлексии, значит, она не настолько востребована в высокопроизводительных приложениях.
Повторюсь, я не знаю, что такое рефлексия и описание из википедии похоже именно на добавление/подмену методов класса.
public: A(B& b): m_b(b) {...}
b. Тот был для копирования не предназначен и при деструкции я получил ошибку двукратного освобождения памяти (которая под MINGW, почему-то, обратилась SEGFAULT-ом).То, что не предполагает копирования, всегда должно иметь соответствующую защиту
И, не говоря мне ни слова, компилятор честно скопировал объект b.
user@host [tmp]$ cppcheck --enable=all copy.cxx
Checking copy.cxx...
[copy.cxx:1]: (style) 'class B' does not have a copy constructor which is recommended since the class contains a pointer to allocated memory.
user@host [tmp]$ valgrind ./a.out
==25907== Memcheck, a memory error detector
==25907== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==25907== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==25907== Command: ./a.out
==25907==
==25907== Invalid free() / delete / delete[] / realloc()
==25907== at 0x4C2A8E0: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25907== by 0x4006C4: B::~B() (copy.cxx:7)
==25907== by 0x400674: main (copy.cxx:22)
==25907== Address 0x5a12c80 is 0 bytes inside a block of size 40 free'd
==25907== at 0x4C2A8E0: operator delete[](void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25907== by 0x4006C4: B::~B() (copy.cxx:7)
==25907== by 0x4006FB: A::~A() (copy.cxx:13)
==25907== by 0x400668: main (copy.cxx:22)
1. Запретить «неявный» копирующий конструктор для объектов и то же самое — с оператором присвоения.
// pre-C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
private:
B(const B&) {}
int *a;
};
// C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
B(const B&)=delete;
private:
int *a;
};
Хотя бы заставить разработчика явно написать «разрешаю копирование» в декларации класса, чтобы исключить «недоразумение по умолчанию». Я бы не поленился пару слов написать — это быстрее, чем полдня дебажить.Одно слово.
// C++11
class B {
public:
B() {
a = new int[10];
}
~B() {
delete[] a;
}
B(const B&)=default;
private:
int *a;
};
Если в классе нет указателей — незачем писать копирующие конструкторы и операторы присвоения, компилятор генерирует их адекватными по умолчанию.
зато там будут объекты не удаляться-освобождаться, потому что он забыл их из коллекции удалять, когда они перестают быть нужны. Это сильно лучше, что ли?
Это какой-то школьник с завышенным ЧСВ и уверенностью в собственной непогрешимости
Компостирование конкретными языками — это уровень ПТУ, а не высшего учебного заведения.
Оба этих языка вроде как описываются как языки общего назначения, значит, на них обоих можно писать что игры, что UI.
пригодный для решения простых задач — UI там писать, игры…
В Си нет ООП
#define CLASS struct. Можно много чего сделать. Но от этого сам язык не станет удобнее при использовании этих возможностей.Хорошо оптимизированный код чаще красивее, чем что то неповоротливое
В низком уровне мы превращаем C++ в Си, на высоком уровне мы пытаемся из него сотворить что-то наподобие C# или Java.
Но это всё — мелочи.
С точки зрения проектирования Listener в Java и event в C# — совершенно одно и то же
И многословность Java тоже не особенно приятна, но она компенсируется мощнейшими средствами IDE.
Все три языка на самом деле очень сильно похожи. Поэтому их можно и нужно сравнивать.
Единственное, чем C++ может похвастаться — это отсутствием дополнительного runtime-а для исполнения кода.А ещё скоростью, а ещё мультиплатформенностью, а ещё гибкостью в плане управления памятью, гибкостью в оптимизации, и тд и тп.
Почему вы считаете, что если для меня эти языки похожи, я не понимаю между ними разницы? Давайте просто допустим, что эта разница несущественна.
Я сначала изучил C++ (по крайней мере на уровне книги Герберта Шилдта), а только потом появился язык C#. А про Java я вообще узнал только 5 лет назад.
Ну вообщето далеко не одно и тоже, Listener в яве требует наследования от интерфейса. Отсюда в яве рождается куча ненужных однострочных интерфейсов, либо же интерфейсов при реализации которых приходится писать пустые функции
Все эти три языка на самом деле сильно разные, пичально что вы это не видите
Вы не понимаете между ними разницы, потому что вы считаете что эта разница несущественна
а ещё мультиплатформенностью
Окей. Давайте тогда я тоже вспомню, что в школе программировал на Delphi.
это анонимный локальный класс.
Вы понимаете, что с точки зрения архитектуры приложения не имеет значения, создается в данном месте анонимный класс, указатель на функцию, определенный через typedef или делегат? Ну не важно это.
Конечно они разные и я это вижу! Но если вы мне дадите программу на C#, я переведу ее вам на Java, воспользовавшись терминами Java...
Я умею использовать все эти три языка
Я лет пять искал способ научиться написать проект на g++ так, чтобы потом нормально собрать его под Windows.
Давайте я тогда вам в ответ расскажу про прекрасный модификатор «b» в fopen
Единственный по-настоящему кроссплатформенный язык в этой тройке — это Java. И то только если вы используете «родную» библиотеку классов от Oracle. Возьмите стек технологий, на которых основан eclipse — будет вам мультиплатформенность.
Только не надо мне говорить про Qt.
Кстати, в нем есть кроссплатформенные файловые потоки?Есть, а чем вам не угодили потоки из stl?
В очередной раз хотите похвастаться своей безграмотностью в С++? Я не против. ))
Не видел ни одного примера, на яве для IOS
А вот этого я не понимаю, серьёзно. Это же так прекрасно, изучать что-то новое! В этом весь смысл и весь кайф!
И звучит для меня, если честно, примерно как «меньше производителей на рынке — выше качество продукта».
Почему-то такого опыта у меня нет. Не поделитесь своим? Просто ради интереса.
Нет. Вы почему-то считаете, что если бы не было какого-нибудь там PyPy или какой-нибудь экзотики, то люди, пилящие эту экзотику, срочно кинулись бы писать основной компилятор. Это очевидно не так.
есть вариант «не пилить ничего»
В очередной раз порадовался, что я разрабатываю под линуксом, установку всяких опенсорс-решений за меня делает пакетный менеджер, и так далее.
Вы так говорите, будто это что-то плохое.
Ну, как минимум, IcedTea ещё.
The aim of the IcePick [часть IcedTea] project is to allow the language tools (javac, javadoc, javah, javap, apt) from the OpenJDK project to be built separately using any 1.5 compliant Java compiler.
Хватило, даже одной руки: clang, gcc, icc, ну и cl.exe ещё, вероятно.
Вышеприведённый мой опенсорс-проект недоступен под убунтой
для хаскеля… из мейнстримных
Думается мне, фортран гарантированно проще, старше и так далее, чем C++, но почему-то компиляторов у него тоже немало.
всефункции по умолчанию передаются по указателю. Это делает отладку больших проектов просто феерической, особенно, если учесть, что многие Fortran-разработчики пользуются этой «милой особенностью» как полезной функцией.
Если вы свободный разработчик, делающий свой проект, то по-прежнему есть. Хрен с ней, с багой чужой, пойду сам бухну.
Куча их: вот. Хотя их надо все палочкой потыкать на предмет свежести.
Вы, наверное, не видели фортран.
Очень хороший язык для математических задач.
Если бы мне внезапно запретили писать мой IM-клиент, я бы не пошёл дописывать Psi или Pidgin, я бы пошёл заниматься матаном.
Извините, что вклиниваюсь в ваш жаркий спор, но таки мне самому интересно.С точки зрения проектирования Listener в Java и event в C# — совершенно одно и то жеНу вообщето далеко не одно и тоже
Listener в яве требует наследования от интерфейса.Ок.
в С# же и в С++ этого можно избежать.Ок.
И таки в чём принципиальная разница?
Критика изначально была в том, что на С++ не нужно писать как на яве.
А если серьезно, то красив хорошо спроектированный код
Когда все хорошо спроектировано, то и оптимизаций меньше надо, если они вообще нужны будут.
сё равно когда вам нужен очень-очень эффективный код, вы перестанете использовать vector и возьметесь за старый добрый int[].
Вы не можете даже полиморфизм толком использовать, потому что vtable — это лишний резолв указателя при каждом вызове функции.Лол, как будто в C# и Java это делается по другому)). Ну и да современные компиляторы, когда могут точно определить класс не прыгают по vtbl.
Всё, что останется от C++ — это статические касты… и C. Вот такой нижний уровень.
Ошибки связывания, необходимость указывать библиотеки глупому линковщику в правильном порядке. Сборочная система CMake хороша, но ее придется учить.
О такой мелочи как аналог JavaDoc я и говорить боюсь…
Лол, как будто в C# и Java это делается по другому)).
И правда IDE то у нас нет
так мало средств для документации С++, даже доксигена нет
было бы неплохо хотя бы 5 минут посидеть и погуглить эти вопросы
Единственное в чём вы оказались правы так это в отсутствии модульности в С++
Я не говорил, что писать в этом случае надо на Java. Я считаю, что в этом случае вполне можно писать на Си.
Есть, конечно, но имеющийся большой проект, например, вы в IDE замучаетесь засовывать.
Я, честно говоря, не в курсе
а есть IDE, которая из комментариев Doxygen делает контекстную подсказку при вводе кода?
Просто он не является частью стандарта — это лишь костыль
Разница между мной и вами в том, что я просто имею более высокую планку требований к инструменту.
у нас на нижнем уровне нужен высокий уровень абстракции
Я люблю Doxygen. Есть ещё варианты.
Проблем с Autotools и make тоже не вижу. Ещё есть qmake, b2.
Вы лучше подумайте, чем и как собирается java runtime.
Кстати в обоих языках можно жить без заголовочников (кроме системных
Не вижу беды в 1000 файлах, если оно так нужно
Дайте конкретный пример одного неразделимого куска кода, где требуется одновременно ООП, высокий уровень абстракции и максимальная производительность.
И, к счастью, разработчикам обычно не приходит в голову изобрести еще одну САМУЮЛУЧШУЮ систему сборки для Java.
Это, простите, как? Инклюдить один сырец из другого? Быстрая у вас, однако, сборка будет…Это плохая техника, но она применяется ( привет средам типа IAR ). Для компиляции указываются только конечные потребители кода.
Но этой кучей должно быть легко управлять
Вы забываете, что Java компилируется в платформонезависимый байткод и там только Java.
И локального тоже.
без хорошей, развитой и мощной системы типов
Думаете, приведете в пример UI сопоставимый по сложности?
А игры, конечно, бывают разные. Бывают и очень непростые алгоритмы, но они очень редки.
Но, еще раз: UI среди них нет.
Что касается браузеров, то там вся сложность — оптимизация.
Вы пытались мне доказать, что Хаскелль не менее удобен для этого. Так? Я не вижу, чтобы его кто-то для перечисленных целей использовал.
Я имел в виду задачи, решаемые фреймворком типа Qt и игровыми движками типа Unity.Дык и я говорю о том же, фреймворки типа Qt и дивижки типа юнити это не простые задачи.
Изначально я утверждал, что C++ плохо справляется с решением задач в той области, для которой он считается (своими же адептами!) наиболее пригодным.Я именно это и оспариваю )).
Если я правильно понял Липперта, то не поймал бы в два счёта с помощью стектрейсов и отладчика просто потому, что оно бы не падало, а просто тихо считало не так.
первым (!) что было сделано на шарпе стало использование какого-то дурацкого IOC фреймворка, который спрятал половину инициализации в непрозрачный third-party бинарник.
Моя позиция в том что с хорошей архитектурой и на плюсах и на шарпе будет написан примерно одинаковый код за примерно одинаковое время.
Поэтому когда человек говорит что на шарпе писать сильно проще то у меня возникает отчетливое ощущение что на плюсах он просто писать так и не научился.[...] Плюсы учить дольше и кривая обучения там круче, а ошибки в нем более красочны.
Но вообще, из «плюсы учить дольше» неизбежно следует «на шарпе писать проще». Потому что иначе почему учить дольше? И весь ваш дальнейший пример это все и подтверждает.
Я пытался показать что более длинное обучение в конце может давать и большую награду (пример с иероглифами).
Я верю что в шарпе без подобного присмотра за джуниорами программа будет падать куда реже чем в плюсах, но, простите, не верю что написанный таким образом код будет легче дебажить или мэйнтэйнить.
Очень плохой пример. Алфавит учится проще и быстрее, чем иероглифическое письмо.
Понимаете ли, вторая часть будет одинаковой в любом языке, поэтому выигрыша в первой — достаточно.
Но в длинной перспективе, как мы знаем, ситуация-то с иероглифами и буквенной записью вырисовывается иная.
Ибо великий WPF отделяет presentation от model, так что наши программисты забабахают model, а дальше WPF ее магическим образом привяжет к UI. Я был сильно против, но именно идея с аутсорсом, насколько я понимаю, в итоге «продала» C# менеджменту.
Кроме того этот пример хорошо показывает что на бумаге микрософтовские технологии типа WPF очень удобны и позволяют делать крутые вещи, а как доходит до реализации — половина обещанного не срастается, а вторая половина неудобна.
В релизе vector[] НЕ проверяет выход за границы.
Однако, многие готовы перестраховаться и переплатить (сейчас их всё меньше). Ибо, если ты не можешь масштабироваться вширь, то экономить на вертикальном масштабировании как минимум глупо, зато делать это железом чаще дешевле.Это вы о чем? Все масштабируемые системы вовсе не на C++ написаны, да и как связаны 10мс и масштабируемость?
Либо, как указал товаришь ниже — системы, которые в принципе сами по себе производительны на грани того, что в них хотят пропихнуть за единицу времени.На моей практике все упиралось в диски, потом в сеть, потом в объем памяти, а лишь в последнюю очередь в процессор.
Ну и больше субьективное мнение — при должном размере и скорости кода, а так же при грамотном ручном управлении памятью, таки общий прогресс системы всё таки будет выше за заданный квант времени (просто не всегда бывает нужен выше).А кто спорит? Только это вы не про C++ пишите. Он, к сожалению, делает довольно много работы (подсчет ссылок, вызов деструкторов, выделение\освобождение памяти). Это на голом C или C_с_классами можно все контролировать, но и вероятность ошибиться на голом C в разы выше.
О_О. Подсчёт ссылок в c++? Походу, я чего то не знаю…
Нет, ну есть конечно всякие умные указатели, однако без них кресты не прям таки сразу превращаются в C_с_чем бы то ни было.Именно сразу и превращаются. По большому счету в чем разница между new\delete и malloc\free, если каждый руками выписывать?
Вот стоит у вас задача, за 100 мс обработать 10 запросов.
Смартпоинтерами не пользуетесь?
Именно сразу и превращаются. По большому счету в чем разница между new\delete и malloc\free, если каждый руками выписывать?— Ни во что не превращается. Отсутствие new/delete никак не связано с умными указателями. Я вот пишу код без new и без умных указателей. Да и по большей части без указателей вообще.
unique_ptr не содержит никакого подсчёта ссылок и не даёт накладных расходов. shared_ptr это специальная вещь, которой пользуются только когда он действительно нужен.
Я вот пишу код без new и без умных указателей. Да и по большей части без указателей вообще.
unique_ptr нельзя передать просто в метод. А если метод может сделать что угодно, то ничего кроме shared_ptr вообще передавать нельзя.
Искренне рад, что у вас такие простые задачи.
Когда запрос приходит по сети, то большая часть времени тратится на сетевой IO. Очевидно что в этом случае надо не ждать пока весь запрос будет получен, а начинать обрабатывать пока клиент шлет байты. Например в RavenDB (NoSQL база на .NET) чуваки сделали так, что умудряются писать на диск пока клиент отправляет данные.— У тех кто этим занимается никаких проблем нет. Вы например про boost.ASIO что-нибудь слышали?
Когда сможете повторить такое на плюсах — приходите поговорить о массовой обработке запросов.
Именно сразу и превращаются. По большому счету в чем разница между new\delete и malloc\free, если каждый руками выписывать?
class Abc
{
string A;
map<string, vector<string>> B
tuple<string, vector<string>> C
}
ООП — это реально ерунда, stl вообще без ООП сделан и выглядит гораздо лучше, чем если бы его сделали на ООП.
Шаблоны — хорошая штука для библиотечного кода, но для прикладных задач вполне можно без них обойтись.
Это как бы неправда любой контейнер в stl имеет определённую иерархию (как минимум в реализации от MS)Это детали реализации, сравни с контейнерной библиотекой C#\Java, там из всех ушей ООП торчит/
Да но тогда придётся отказаться от stl или использование шаблонов и их написание это взаимоисключающие вещи? И опять же, да для проектов Hello world они и правда ненужны, но вот в реальности всё не так радужно.В реальности прикладной код (который решает бизнес-задачу) почти не требует шаблонов. Прикладной код конкретный, а не обобщенный.
ОК, вот у вас есть A. И вы хотите A передать в функцию, которая может делать что угодно, вплоть до того, что сохранить A в глобальной переменной. Привет умные указатели ;)
То что вы можете в подмножестве кода обойтись без умных указателей не означает, что можно писать идиоматичный C++ код вообще без них.
Это детали реализации
В реальности прикладной код (который решает бизнес-задачу) почти не требует шаблонов. Прикладной код конкретный, а не обобщенный.
shared_ptr, который вы вероятно имели ввиду когда говорили про подсчёт ссылкок, в реальной жизни нужен не так уж и частоЭто зависит от задачи. Чем сложнее задача, тем сложнее все свести к древовидному владению, тем больше расходы на поддержку указателей и меньше выйгрыша от использования C++.
Тем не менее огромное количество игр делается на Unity, который, внимание, C#
Самое смешное, что для высокоуровневой логики в играх используются скриптовые языки, которые иногда тормозят дико.
Который, внимание, С++. С# используется лишь для скриптования игровой логики, упс.
Именно что для игровой логики которая является наименьшей проблемой для производительности, ваш кэпОна является наибольшей. Помню игру СТАЛКЕР, у которой логика на Lua. Бегаешь по полям — 30+ fps, появляются 3-4 противника (не в кадре, а просто в окружении) — 12 fps. Это ты называешь наименьшей проблемой? Или цивилизация, в которой противники ходят минутами это меньшая проблема?
Как же люди целые игры пишут только на C#, они наверное не знают что там надо C++ использовать.
Она является наибольшей. Помню игру СТАЛКЕР, у которой логика на Lua. Бегаешь по полям — 30+ fps, появляются 3-4 противника (не в кадре, а просто в окружении) — 12 fps. Это ты называешь наименьшей проблемой?Да это наименьшая проблема, я не знаю как устроен движок для сталкера, но склонен думать что это проблема не скриптового языка а организации архитектуры в целом.
Я говорил про сам движок, который написан на С++, а не про пользователей этого движка.
Да это наименьшая проблема, я не знаю как устроен движок для сталкера, но склонен думать что это проблема не скриптового языка а организации архитектуры в целом.От повторения оно правдой не станет. В сталкере проблема была именно в скриптовой логике, там десятки тысяч строк, поведение персонажей заскриптовано, поэтому при нескольких персонажах на сцене все тормозит.
А пользователи движка не программируют графику и физику на C#? Или они там магически сами считаются?
А пользователи движка не программируют графику и физику на C#?
они там магически сами считаются?
В сталкере проблема была именно в скриптовой логике, там десятки тысяч строк, поведение персонажей заскриптовано, поэтому при нескольких персонажах на сцене все тормозит.Вы перед профайлером свечку держали? Откуда такая уверенность?
Самое смешное, что для высокоуровневой логики в играх используются скриптовые языки, которые иногда тормозят дико. Почему бы их не заменить на C++? Оказывается C++ слишком сложен для этих задач.
В большом приложении такой оверхед сожрет весь выигрыш от использования C++.
Даже если весь ассемблерный код, кроме деаллокации, будет идентичным, C# будет медленнее (тестов у меня, конечно, нет, и все зависит от «паттернов» аллокации-деаллокации, но тем не менее).
В режиме x86 оптимизатор полностью выкинул сортировку для std::array, поэтому получилось 0. В реальности работает чуть быстрее, чем C-style массив за счет отсутствия аллокаций.
asm volatile("");
Практически весь реальный код требует аллокации и освобождения памяти и там, сдается мне, шарпу резко станет хуже.
Математика там была тривиальной, а вот работа с памятью требовала эффективно аллоцировать и деаллоцировать кучу мелких объектов и объединять их затем в объекты покрупнее.Если объекты короткоживущие, то C# сильно быстрее C++ будет. У C++ встроенный аллокатор медленный, в каждой второй advanced c++ книге выдумывают свой аллокатор по этому поводу.
Не получается ли так, что Вы банально вынесли работу с GC за пределы измерения
Представьте себе квадратичный многочлен от N переменных, для которого сложение определено тривиальным образом, а умножение отбрасывает степени полинома выше второй… Ну и взять N=600
пойдите и предложитеА где об этом почитать?
ну потому что «почти так же по скорости, а писать удобнее».
Еще одно сравнение производительности С++ и C#