Когда я должен использовать __ forceinline вместо встроенного?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
32
задан jonrsharpe 19 February 2015 в 21:52
поделиться

7 ответов

Компилятор принимает свои решения на основе статического анализа кода, тогда как, если Вы представляете, поскольку Дон говорит, Вы выполняете динамический анализ, который может намного дальше достигать. Количество вызовов к определенной части кода часто в основном определяется контекстом, в котором это используется, например, данные. Профилирование типичного набора вариантов использования сделает это. Лично, я собираю эту информацию путем включения представляющий на моих автоматизированных регрессионных тестах. В дополнение к принуждению встраивает, я развернул циклы и выполнил другую ручную оптимизацию на основе таких данных, успешно. Также обязательно представить снова впоследствии, поскольку иногда Ваши максимальные усилия могут на самом деле привести к уменьшенной производительности. Снова, автоматизация делает это намного менее болезненным.

, Как правило, хотя, по моему опыту, настраивая alogorithms дает намного лучшие результаты, чем прямая оптимизация кода.

19
ответ дан 27 November 2019 в 19:45
поделиться

Вы знаете лучше, чем компилятор только, когда Ваши профильные данные говорят Вам так.

43
ответ дан 27 November 2019 в 19:45
поделиться

Я разрабатывал программное обеспечение для устройств ограниченного ресурса в течение приблизительно 9 лет и только время, я когда-либо видел, что потребность использовать __forceinline была в жестком цикле, где драйвер камеры должен был скопировать пиксельные данные от накопительного буфера до экрана устройства. Там мы могли ясно видеть что стоимость определенного вызова функции действительно hogged производительность рисования наложения.

8
ответ дан 27 November 2019 в 19:45
поделиться

Одно место я использую его, является проверкой лицензии.

Один важный фактор для защиты от легкого* взламывание должно проверить быть лицензируемым в нескольких местах, а не только одном, и Вы не хотите, чтобы эти места были тем же вызовом функции.

<час>

*) не поворачивайте это в обсуждении, что все может быть взломано - я знаю. Кроме того, это одно не помогает многому.

34
ответ дан 27 November 2019 в 19:45
поделиться

Единственный способ быть уверенным состоит в том, чтобы измерить уровень с и без. Если Вы не напишете высоко производительности критический код, это обычно будет ненужным.

6
ответ дан 27 November 2019 в 19:45
поделиться

Существует несколько ситуаций, где компилятор не может определить категорически, является ли это соответствующим или выгодным встроить функцию. Встраивание может включить компромисс, который компилятор не желает сделать, но Вы (например, кодируйте чрезмерное увеличение размера).

В целом, современные компиляторы на самом деле довольно хороши в принятии этого решения.

1
ответ дан 27 November 2019 в 19:45
поделиться

Встроенная директива будет совершенно бесполезна при использовании для функций, которые:

рекурсивны, длинный, состоящий из циклов,

Если вы хотите заставить это решение использовать __forceinline

3
ответ дан 27 November 2019 в 19:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: