Information
- Rating
- Does not participate
- Location
- Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Software Architect
PostgreSQL
C#
C++
Linux
Docker
Kubernetes
High-loaded systems
Designing application architecture
Database design
А теперь я предлагаю вам подтвердить своё утверждение результатами тестов, где ваш сравниваемый код на javascript требует для выполнения меньше памяти.
Сомнительная функция, допустим у меня в makefile что-то такое:
Тем более, что сборка часто запускается в много потоков, отжирая все 100% ресурсов машины. В таких условиях сложно синхронизировать параллельную работу компилятора и анализатора. А исходники к тому же могут быть как временными файлами, так и просто потоками.
Самым универсальным способом для любой системы сборки была бы замена компилятора, например:
При этом собственно сначала отрабатывает анализатор, который получает на вход всю нужную команду компилятора, а затем передает эстафету компилятору.
Впрочем standalone версия, без запуска компиляции, тоже была бы полезна. Я бы, например, использовал анализатор как дополнительный шаг сборки в пререквизитах для компиляции.
Ну и совсем шикарно если бы вы учли возможность кросс-компиляции. У существующих анализаторов с этим как-то не очень.
Если дело пойдет, буду агитировать за внедрение вашего продукта у нас. Удачи!
И резуьтат работы программы будет несколько отличным от приведенного в статье:
Вывод который сделал автор о работе программы не имеет отношения к copy elision. И на его компиляторе оптимизации не происходило.
Ничего компилятор не проигнорировал. В этом случае вообще нет copy elision. Создал временный объект, скопировал его, вызвал деструктор. И так два раза. Итого 6. Деструкторы объектов m2 и m3 вызываются уже при выходе из main(). А вот что действительно вызывает вопрос: почему в вашем выводе не присутствует вывода из этих деструкторов. Корректный результат, который получаю я, должен выглядеть так:
В следующем примере у вас вообще undefined behavior, так как вы возвращаете ссылку на временный объект. Обратный порядок вызова копирующего конструктора и деструктора обусловлен тем, что вы не продлеваете время жизни временных объектов, возвращая иx по значению. Они удаляются до выхода из функции.
Copy elision это очень полезная оптимизация, и в 99.999% случаев она обладает не только желаемым, но и вполне очевидным для программиста поведением, а вы её выставляете как какое-то зло и источник проблем.
P.S. Здесь вы забыли вернуть значение:
Сделаем вот такие хелперы:
Тогда программа будет выглядеть вот так:
Ни разу не видел более плохого решения, вы хотите получить целое число, но при этом используете логарифмы и экспоненты для такой тривиальной задачи. К тому же у вас по условию только целочисленная арифметика.
Всё будет заинлейнено.
Но что мешает использовать тот же подход в C++/Java?