2013-09-30 2 views
0

Разумно место следующего кода в инлайн функции, или он слишком велик для встраивания:как маленькие должен быть код для встраивания

getPriority(const Data& data) 
{ 
    Priority plidPriority = PRIORITY_STANDARD; 

    if (data.isIPaddr) 
    { 
     Priority = PRIORITY_HIGHEST; 
    } 
    else if (data.plid == PROTO_HTTP || data.plid == PROTO_SIP || data.plid == PROTO_RTCP) 
    { 
     Priority = PRIORITY_PLID; 
    } 
    else if (data.port && data.port < 1024) 
    { 
     Priority = PRIORITY_ELEVATED; 
    } 

    return Priority; 
} 
+1

Почему вы не доверяете ваш компилятор, чтобы сделать правильное решение по этому поводу? Если вы не делаете это десятки миллионов раз в секунду, разница в любом случае будет незначительной. – us2012

+1

Не уверен, что он отвечает на ваш вопрос, но эта статья может вас заинтересовать: http://www.drdobbs.com/inline-redux/184403879 –

+0

Беспокойство об этом, когда ваш профилировщик показал, что эта функция вызывает проблему. –

ответ

1

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

0

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

Так что это зависит от того, как эта функция вызывается из кода, который здесь не показан.

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

0

Inlining - действительно просто предложение для компилятора. В вашем случае это будет, вероятно, вставит его уже или полностью игнорировать встроенное ключевое слово

1
  1. Как короткую функция должна быть для автоматически-подкладки? Есть ли какой-либо лимит для этого?

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

2. Is there any way to know that a function is automatically in-lined ? 

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

Do inline functions improve performance?

Inline Functions

Смежные вопросы