none
Встраиваемые функции взамен макросам. RRS feed

  • Вопрос

  • Доброго времени суток, возникла интересная проблема. Во избежании падения производительности (именно в отладочном режиме) некоторые функции классов объявил как "inline" (Также включил встраивание функций в настройках "Только inline"). Но встраивает компилятор функции совершенно не так как ожидалось и хотелось. Для встраивания идеально подходят макросы, но ими пользоваться не есть хорошо (если пользоваться ими обильно) из-за того, что они не соблюдают область видимости. В добавок невозможно обратиться к приватным членам класса. А именно вот о чем идет речь:

    Для примера возьмем такой код:

    inline bool iszero(int a)
    {
        return (a == 0);
    }
    
    int main()
    {
        int a = 4;
    
        if(a == 0) // First
            a = 5;
    
        if(iszero(a)) // Second
            a = 5;
    
        ///...
    }

    Дизассемблер показал код на выходе, подобный следующему ("переведено" на C++):

    if(a == 0) // First
         a = 5;
    
    bool temp; // Second
    if(a == 0)
        temp = 0;
    else
        temp = 1;
    
    if(temp == 0)
        a = 5;

    То есть он встроил, но не очень умно. Можно ли заставить "немножко думать" компилятора в плане встраивания? А то смыслом использования "inline" является повышение производительности в режиме отладки. А такое поведение все портит.

    17 ноября 2012 г. 18:38

Ответы

  • Попробуйте поиграть с ключами оптимизации, вообще inline для компилятора не более чем рекомендация, т.е. он может и вовсе не сделать ее встраиваемой. Ещё может быть есть смысл проверить на разных компиляторах.
    • Предложено в качестве ответа Abolmasov Dmitry 29 ноября 2012 г. 14:08
    • Помечено в качестве ответа Abolmasov Dmitry 6 декабря 2012 г. 10:53
    19 ноября 2012 г. 6:16

Все ответы

  • Попробуйте поиграть с ключами оптимизации, вообще inline для компилятора не более чем рекомендация, т.е. он может и вовсе не сделать ее встраиваемой. Ещё может быть есть смысл проверить на разных компиляторах.
    • Предложено в качестве ответа Abolmasov Dmitry 29 ноября 2012 г. 14:08
    • Помечено в качестве ответа Abolmasov Dmitry 6 декабря 2012 г. 10:53
    19 ноября 2012 г. 6:16
  • Вариант с разными компиляторами отпадает - я работаю только в MVS.

    Подумал и пришел к выводу, что для решения моей задачи (она не указана в топике, однако я попытался разрешить ее используя inline) нужно: Постпроцессор либо макросный движок, который будет обладать бОльшим функционалом. Либо какая-нибудь реализация макросов как функций класса. Кто и что может по этому поводу посоветовать?


    • Изменено 4Bytes 20 ноября 2012 г. 11:53
    20 ноября 2012 г. 11:41
  • Нужно пробовать вам различные опции оптимизации компилятора, но ее применять лучше в релизе, а не в дебаге. Потому что иначе дебажить будет либо невозможно, либо не просто.

    Также можно попробовать ключевое слово _forceinline


    Для связи [mail]

    29 ноября 2012 г. 14:07