<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Должны ли быть видны в inline-функции в профиляторе Gprof ?</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html</link>
    <description>Вопрос в следующем.&lt;br&gt;&lt;br&gt;У меня есть функции (точнее, методы, но все происходит в пределах одного класса, причем экземпляр класса один), которые много раз вызываются в цикле. Представляют собой несложные математические вычисления, этакий синтаксический сахар.&lt;br&gt;&lt;br&gt;Такие функции, да еще и вызываемые в циклах, имеет смысл объявлять инлайновыми. Это необходимо, чтобы не тратилось время на работу со стеком/регистрами при подготовке вызова, на сам вызов функции, на возврат результата.&lt;br&gt;&lt;br&gt;То есть предполагается, что в машинном коде вызовов этих функций не должно быть, ибо они непосредственно встаиваются в машинный код вместо своего CALL.&lt;br&gt;&lt;br&gt;При профилировании через gprof я вижу, что эти inline функции показываются в gprof, и gprof показывает число их вызовов. &lt;br&gt;&lt;br&gt;&#091;b&#093;Вопрос:&#091;/b&#093;&lt;br&gt;&lt;br&gt;Это gprof такой умный, видит работу инлайновых функций, подсчитывает число их &quot;виртуальных&quot; вызов? Или данные функции, несмотря на директиву inline, скомпилены таки в виде обычных функций, и поэтому их видит gprof?&lt;br&gt;&lt;br&gt;Пример функций:&lt;br&gt;&lt;br&gt;&#091;code</description>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (skb7)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#7</link>
    <pubDate>Thu, 13 Nov 2014 10:23:07 GMT</pubDate>
    <description>&amp;gt; static inline int f1(int a) __attribute__((always_inline)); &lt;br&gt;&amp;gt; static inline int f2(int a) __attribute__((always_inline)); &lt;br&gt;&lt;br&gt;Я вам даже больше скажу, если удалить эти строки, функции всё равно заинлайнятся. Они у вас инлайнятся, потому что они у вас static, а не always_inline. always_inline только и позволяет что инлайнить с отключенными оптимизациями. Если хотите инлайнить всегда -- смотрите в сторону атрибута flatten. И то может не заинлайниться. Поэтому #define рулит :)&lt;br&gt;&lt;br&gt;Отсюда https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html :&lt;br&gt;&#091;code&#093;&lt;br&gt;always_inline&lt;br&gt;    Generally, functions are not inlined unless optimization is specified. For functions declared inline, this attribute inlines the function even if no optimization level was specified.&lt;br&gt;&lt;br&gt;flatten&lt;br&gt;    Generally, inlining into a function is limited. For a function marked with this attribute, every call inside this function will be inlined, if possible. Whether the function itself is considered for inlining depends on its size and t</description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#6</link>
    <pubDate>Thu, 13 Nov 2014 00:52:05 GMT</pubDate>
    <description>&amp;gt; Такие функции, да еще и вызываемые в циклах, имеет смысл объявлять инлайновыми. &lt;br&gt;&amp;gt; Это необходимо, чтобы не тратилось время на работу со стеком/регистрами при &lt;br&gt;&amp;gt; подготовке вызова, на сам вызов функции, на возврат результата.&lt;br&gt;&lt;br&gt;Функции инлайнить нужно только те, в которых не вызываются другие функции.&lt;br&gt;</description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#5</link>
    <pubDate>Thu, 13 Nov 2014 00:45:20 GMT</pubDate>
    <description>&amp;gt; Это я не додумал. &lt;br&gt;&lt;br&gt;Через пару лет поймешь, что написал в функции, а другие? :) &lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (pavlinux)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#4</link>
    <pubDate>Thu, 13 Nov 2014 00:38:43 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&lt;br&gt;&#091;code&#093; &lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;&lt;br&gt;static inline int f1(int a) __attribute__((always_inline));&lt;br&gt;static inline int f2(int a) __attribute__((always_inline));&lt;br&gt;&lt;br&gt;static inline int f1(int a)&lt;br&gt;&#123;&lt;br&gt;        return a + 1;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;static inline int f2(int a)&lt;br&gt;&#123;&lt;br&gt;        int i;&lt;br&gt;&lt;br&gt;        for (i = 0; i &amp;lt; 10; ++i) &#123;&lt;br&gt;                if (a &amp;lt; 5)&lt;br&gt;                        a += 2;&lt;br&gt;                else&lt;br&gt;                        a += 3;&lt;br&gt;        &#125;&lt;br&gt;&lt;br&gt;        printf(&quot;f2 done&#092;n&quot;);&lt;br&gt;&lt;br&gt;        return a;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;int main(void)&lt;br&gt;&#123;&lt;br&gt;        int x = 5;&lt;br&gt;&lt;br&gt;        x = f1(x);&lt;br&gt;        x = f2(x);&lt;br&gt;&lt;br&gt;        printf(&quot;x = &#037;d&#092;n&quot;, x);&lt;br&gt;&lt;br&gt;        return EXIT_SUCCESS;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093; &lt;br&gt;&amp;gt; Компилируем и смотрим какие функции заинлайнились, а какие нет: &lt;br&gt;&amp;gt; &#091;code&#093; &lt;br&gt;&amp;gt; $ gcc -Wall -O2 main.c &lt;br&gt;&amp;gt; $ objdump -DCS a.out &amp;#124; less &lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; Видем следующую картину: &lt;br&gt;&lt;br&gt;&#091;code&#093; &lt;br&gt;0000000000400546 &amp;lt;main&amp;gt;:&lt;br&gt;  400546:       55                      push   &#037;rbp&lt;br&gt;  400547:       48 89 e5                mov    &#037;rsp,&#037;rbp&lt;br&gt;  </description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (xintrea)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#3</link>
    <pubDate>Wed, 12 Nov 2014 20:16:34 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; 2. И вообще, то что вы хотите сделать, делается в одну строку &lt;br&gt;&amp;gt; :) &lt;br&gt;&amp;gt; &#091;code&#093; &lt;br&gt;&amp;gt; inline unsigned char RC5Simple::RC5_GetByteFromWord(RC5_TWORD w, int n) &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;     return (w &amp;gt;&amp;gt; (n*8)) &amp; 0xff; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&lt;br&gt;Ага, вместо того чтобы маскировать с разными масками и сдвигать в краю слова, можно сдвинуть к краю слова и отмаскировать фиксированной маской. Это я не додумал. Так реально без всяких переходов.&lt;br&gt;&lt;br&gt;Но попробую макросами, чтоб наверняка.&lt;br&gt;</description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (skb7)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#2</link>
    <pubDate>Wed, 12 Nov 2014 15:50:47 GMT</pubDate>
    <description>А еще хотелось бы покритиковать вашу функцию :) Которая RC5_GetByteFromWord().&lt;br&gt;1. Функция легко упрощается до формы:&lt;br&gt;&#091;code&#093;&lt;br&gt;inline unsigned char RC5Simple::RC5_GetByteFromWord(RC5_TWORD w, int n)&lt;br&gt;&#123;&lt;br&gt;switch (n) &#123;                                                                                  &lt;br&gt;case 0:&lt;br&gt;    return w &amp; 0x000000FF;&lt;br&gt;case 1:&lt;br&gt;    return (w &amp; 0x0000FF00) &amp;gt;&amp;gt; 8;&lt;br&gt;case 2:&lt;br&gt;    return (w &amp; 0x00FF0000) &amp;gt;&amp;gt; 16;&lt;br&gt;case 3:&lt;br&gt;    return (w &amp; 0xFF000000) &amp;gt;&amp;gt; 24;&lt;br&gt;default:&lt;br&gt;    return 0;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;2. И вообще, то что вы хотите сделать, делается в одну строку :)&lt;br&gt;&#091;code&#093;&lt;br&gt;inline unsigned char RC5Simple::RC5_GetByteFromWord(RC5_TWORD w, int n)&lt;br&gt;&#123;&lt;br&gt;    return (w &amp;gt;&amp;gt; (n*8)) &amp; 0xff;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Тогда может и заинлайнится функция, а если нет, то:&lt;br&gt;&#091;code&#093;&lt;br&gt;#define GET_BYTE(w, n) ((w) &amp;gt;&amp;gt; ((n)*8) &amp; 0xff)&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Только у макроса свои недостатки, на которые можно напороться.&lt;br&gt;</description>
</item>

<item>
    <title>Должны ли быть видны в inline-функции в профиляторе Gprof ? (skb7)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9938.html#1</link>
    <pubDate>Wed, 12 Nov 2014 15:28:13 GMT</pubDate>
    <description>Не знаю как в C++, но в чистом C &quot;inline&quot; -- это лишь &#091;b&#093;рекомендация&#091;/b&#093; компилятору встраивать эти функции. Компилятор часто игнорирует эту рекомендацию (когда функция больше 1-2 строк). Единственный способ реально инлайнить функции, который я знаю, -- это макросы (#define). Даже attribute((always_inline)) на помогает, он просто говорит сохранять смысл inline (рекомендация на встраивание) при отключенных оптимизациях (-O0).&lt;br&gt;&lt;br&gt;Смотрим http://en.wikipedia.org/wiki/Inline_function :&lt;br&gt;&#091;code&#093;&lt;br&gt;The compiler may ignore the programmer&amp;#8217;s attempt to inline a function, mainly if it is particularly large.&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Например вот код:&lt;br&gt;&#091;code&#093;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;&lt;br&gt;inline int f1(int a)&lt;br&gt;&#123;&lt;br&gt;return a + 1;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;inline int f2(int a)&lt;br&gt;&#123;&lt;br&gt;int i;&lt;br&gt;&lt;br&gt;for (i = 0; i &amp;lt; 10; ++i) &#123;&lt;br&gt;if (a &amp;lt; 5)&lt;br&gt;a += 2;&lt;br&gt;else&lt;br&gt;a += 3;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;printf(&quot;f2 done&#092;n&quot;);&lt;br&gt;&lt;br&gt;return a;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;int main(void)&lt;br&gt;&#123;&lt;br&gt;int x = 5;&lt;br&gt;&lt;br&gt;x = f1(x);&lt;br&gt;x = f2(x);&lt;br&gt;&lt;br&gt;printf(&quot;x = &#037;d&#092;n&quot;, x);&lt;br&gt;&lt;br&gt;return EXIT_SUCCESS;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;К</description>
</item>

</channel>
</rss>
