Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Компилятор принимает свои решения на основе статического анализа кода, тогда как, если Вы представляете, поскольку Дон говорит, Вы выполняете динамический анализ, который может намного дальше достигать. Количество вызовов к определенной части кода часто в основном определяется контекстом, в котором это используется, например, данные. Профилирование типичного набора вариантов использования сделает это. Лично, я собираю эту информацию путем включения представляющий на моих автоматизированных регрессионных тестах. В дополнение к принуждению встраивает, я развернул циклы и выполнил другую ручную оптимизацию на основе таких данных, успешно. Также обязательно представить снова впоследствии, поскольку иногда Ваши максимальные усилия могут на самом деле привести к уменьшенной производительности. Снова, автоматизация делает это намного менее болезненным.
, Как правило, хотя, по моему опыту, настраивая alogorithms дает намного лучшие результаты, чем прямая оптимизация кода.
Вы знаете лучше, чем компилятор только, когда Ваши профильные данные говорят Вам так.
Я разрабатывал программное обеспечение для устройств ограниченного ресурса в течение приблизительно 9 лет и только время, я когда-либо видел, что потребность использовать __forceinline
была в жестком цикле, где драйвер камеры должен был скопировать пиксельные данные от накопительного буфера до экрана устройства. Там мы могли ясно видеть что стоимость определенного вызова функции действительно hogged производительность рисования наложения.
Одно место я использую его, является проверкой лицензии.
Один важный фактор для защиты от легкого* взламывание должно проверить быть лицензируемым в нескольких местах, а не только одном, и Вы не хотите, чтобы эти места были тем же вызовом функции.
<час>*) не поворачивайте это в обсуждении, что все может быть взломано - я знаю. Кроме того, это одно не помогает многому.
Единственный способ быть уверенным состоит в том, чтобы измерить уровень с и без. Если Вы не напишете высоко производительности критический код, это обычно будет ненужным.
Существует несколько ситуаций, где компилятор не может определить категорически, является ли это соответствующим или выгодным встроить функцию. Встраивание может включить компромисс, который компилятор не желает сделать, но Вы (например, кодируйте чрезмерное увеличение размера).
В целом, современные компиляторы на самом деле довольно хороши в принятии этого решения.
Встроенная директива будет совершенно бесполезна при использовании для функций, которые:
рекурсивны, длинный, состоящий из циклов,
Если вы хотите заставить это решение использовать __forceinline