C++ _inline игнорируется в синглтоне и отображается в моем профайлере. Как так?

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам