C ++ _inline игнорируется в синглтоне и отображается в моем профайлере. Как так? - PullRequest
4 голосов
/ 23 июня 2011

У меня есть много классов в моем проекте, доступ к которым осуществляется синглтоном, например:

_inline GUI_BS_Map* GUI_GetBS_Map()
{
    static GUI_BS_Map obj;
    return &obj;
};

Насколько я понимаю, этот код должен быть встроен. У меня есть параметры Visual Studio (2005), чтобы встроить что-нибудь подходящее, и мой профилировщик (AQTime) определенно не настроен на переопределение _inlines. Тем не менее, когда я профилирую код, то это тысячи вызовов каждой из моих одноэлементных функций. Чего мне не хватать? (Я профилирую отладочную сборку (чтобы получить символы для профилировщика), но со всеми включенными оптимизациями скорости.) Любые предложения высоко ценится!

Ответы [ 5 ]

9 голосов
/ 23 июня 2011

Компилятор может игнорировать inline и _inline. В Visual C ++ вы можете попробовать __forceinline, который делает встроенные функции компилятора, если нет серьезных причин не делать этого (такие причины перечислены в связанной статье MSDN).

1 голос
/ 23 июня 2011

Как уже было сказано - компилятор может свободно игнорировать встроенный код.

Также гораздо вероятнее игнорировать любые встроенные вызовы при сборке в Debug, чтобы помочь в отладке (так что точки останова во встроенных функциях правильно зацепляются и т. Д.)).

Я бы посоветовал не профилировать отладочную версию (если вы можете избежать этого), так как компилятор VS работает очень по-разному между Debug и Release, и вы можете получить ошибочные результаты .....

1 голос
/ 23 июня 2011

inline - это семантическое значение: вы не можете заставить компилятор фактически что-либо встроить, это деталь реализации, и он может смеяться над вами и отказываться в любое время.

1 голос
/ 23 июня 2011

Inline - это только предложение для компилятора.Он может игнорировать ваше предложение или даже встроенные функции, которые вы не пометили как встроенные.

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

0 голосов
/ 23 июня 2011

Во-первых, C ++ имеет ключевое слово inline, но не _inline._inline - это макрос?Расширение для конкретного компилятора?Что-то связано с вашим профилировщиком?

Во-вторых, компилятор C ++ обычно вставляет все, что ему нравится, и ключевое слово inline - в лучшем случае , подсказка, что вы хотели бы видетьфункция встроенная.

Основная цель ключевого слова inline сегодня не в том, чтобы включить встроенную оптимизацию 1015 * (которую компилятор применяет довольно агрессивно, независимо от того, говорите вы это или нет)to), но вместо этого для подавления правила One-Definition-Rule (ODR), чтобы функция могла быть полностью определена в заголовке, не рискуя множественными ошибками определений из компоновщика.

...