<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_42460"  />
<title>rulinux.net - Форум - Development -  c++ final class почему компилятор не делает inline</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development -  c++ final class почему компилятор не делает inline</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215534</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215534</guid>
<pubDate>Wed, 23 Mar 2016 11:39:40 +0300</pubDate>
<description><![CDATA[<p>ТС-то интересуется почему компилятор не заинлайнил оба метода в конкретной ситуации. Вроде уже договорились, что final тут ни при чём, но по сути вопроса пока идей чота нет.</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215531</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215531</guid>
<pubDate>Tue, 22 Mar 2016 20:11:42 +0300</pubDate>
<description><![CDATA[<p>погодите, народ!<br><br>Инлайнинг — это не свойство вызываемой функции, а свойство контекста, из которого вызвана функция. Разные вызовы одной и той же функции могут как заинлайниться, так и нет.<br><br>Тот факт, что некоторые вызовы были заинланйнены, не отменяет генерации отдельного символа для заинлайненной функции и не модифицирует vtable. Это позволяет использовать обычный vtable/call там, где инлайнинг невозможен, например, в преведенной выше theUniversalFunMultiplier. </p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215525</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215525</guid>
<pubDate>Mon, 21 Mar 2016 13:54:04 +0300</pubDate>
<description><![CDATA[<p>Я к тому, что слово &quot;final&quot; тут скорее всего не играет роли.</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215522</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215522</guid>
<pubDate>Mon, 21 Mar 2016 04:41:20 +0300</pubDate>
<description><![CDATA[<p>В функции gmain (о которой изначально шла речь) - заранее известно, какие конкретные методы будут вызваны. Тело функции gmain можно целиком inline-ить.0<br><br>В функции theUniversalFunMultiplier - заранее неизвестно, какие методы будут вызваны. Тело theUniversalFunMultiplier нельзя целиком inline-ить.</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215512</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215512</guid>
<pubDate>Sun, 20 Mar 2016 08:50:01 +0300</pubDate>
<description><![CDATA[<p>&gt; мы заранее знаем, какие именно методы должны вызваться
<br><br>
Где-нибудь у класс D появляется &quot;сосед&quot; E:
<br>
<fieldset><legend>cpp</legend><div class="highlight cpp"><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> E final<span class="sy4">:</span> <span class="kw2">public</span> A2<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">long</span> fun2<span class="br0">&#40;</span><span class="kw4">long</span> a<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a<span class="sy2">+</span><span class="nu0">144</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy4">;</span><br />
&nbsp;</div></fieldset>
<br>
И код, которому абстрактно на конкретную реализацию:
<br>
<fieldset><legend>cpp</legend><div class="highlight cpp"><br />
<span class="kw4">long</span> theUniversalFunMultiplier<span class="br0">&#40;</span>A2 <span class="sy3">&amp;</span>a2, <span class="kw4">long</span> p<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> 2 <span class="sy2">*</span> a2.<span class="me1">fun2</span><span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy4">;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset>
</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215507</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215507</guid>
<pubDate>Sat, 19 Mar 2016 16:15:08 +0300</pubDate>
<description><![CDATA[<p>оба метода являются виртуальными и оба допускают девиртуализацию и инлайнинг метод C::fun виртуальный, т.к. является таковым в базовом классе A. слово virtual не обязательно писать для метода C::fun.<br><br>вызов c.fun() можно встроить, т.к. даже если по факту объект c является неким типом C1, который унаследован от C, то метод fun не может быть переопределен в C1, т.к. помечен словом final<br><br>вызов d.fun2() можно встроить, т.к. переменная d не может являться неким типом D1, унаследованным от D, т.к. класс D помечен словом final то есть в статике (при компиляции) мы заранее знаем, какие именно методы должны вызваться и можем их встроить. хаки в таблицах виртуальных функций уже идут лесом, т.к. это UB</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215482</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215482</guid>
<pubDate>Fri, 18 Mar 2016 19:08:29 +0300</pubDate>
<description><![CDATA[<p>Мне кажется это всё от того, что метод объявлен виртуальным. c.fun не объявлен виртуальным, а A2::fun2 же объявлен.  И, КМК, final запрещает наследовать класс, но с чего бы ему развиртуализировать метод?</p>]]></description>
</item>
<item>
<title>Re: c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215475</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215475</guid>
<pubDate>Fri, 18 Mar 2016 10:08:55 +0300</pubDate>
<description><![CDATA[<p><br><br>один вызов развернул, второй вообще оставил виртуальным.<br><br>Это баг или я чего-то не понимаю в final ? </p>]]></description>
</item>
<item>
<title> c++ final class почему компилятор не делает inline</title>
<link>https://rulinux.net/message.php?newsid=42460&amp;page=1#215474</link>
<guid>https://rulinux.net/message.php?newsid=42460&amp;page=1#215474</guid>
<pubDate>Fri, 18 Mar 2016 10:06:48 +0300</pubDate>
<description><![CDATA[<p><fieldset><legend>cpp</legend><div class="highlight cpp"><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> A<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">long</span> fun<span class="br0">&#40;</span><span class="kw4">long</span> a<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a<span class="sy2">+</span><span class="nu0">11</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> A2<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">long</span> fun2<span class="br0">&#40;</span><span class="kw4">long</span> a<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a<span class="sy2">+</span><span class="nu0">44</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> C<span class="sy4">:</span> <span class="kw2">public</span> A<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">long</span> fun<span class="br0">&#40;</span><span class="kw4">long</span> a<span class="br0">&#41;</span> final<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a<span class="sy2">+</span><span class="nu0">33</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> D final<span class="sy4">:</span> <span class="kw2">public</span> A2<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">long</span> gmain<span class="br0">&#40;</span><span class="kw4">long</span> j, C <span class="sy3">&amp;</span>c, D <span class="sy3">&amp;</span>d<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j <span class="sy1">=</span> c.<span class="me1">fun</span><span class="br0">&#40;</span>j<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; <span class="co1">// direct &nbsp; j = j1 + 33</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j<span class="sy2">*</span><span class="sy1">=</span><span class="nu0">141</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// 45 * (j1+33) * 141 = j1*141 + 4653</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j <span class="sy1">=</span> d.<span class="me1">fun2</span><span class="br0">&#40;</span>j<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">// direct? &nbsp;j = j1*141 + 4697</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j<span class="sy2">*</span><span class="sy1">=</span><span class="nu0">151</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == j1*21291 + 709247</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> j<span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp;</div></fieldset><br><br>результат (gcc 5.3.0), /opt/gdc/bin/g++ -std=c++11 -O3 -S virt-cpp-inline.cpp<br><br><fieldset><legend>asm</legend><div class="highlight asm"><br />
<br />
&nbsp; &nbsp; <span class="sy0">.</span>globl &nbsp;_Z5gmainlR1CR1D<br />
&nbsp; &nbsp; <span class="sy0">.</span><span class="kw4">type</span> &nbsp; _Z5gmainlR1CR1D<span class="sy0">,</span> @function<br />
_Z5gmainlR1CR1D<span class="sy0">:</span><br />
<span class="sy0">.</span>LFB3<span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="sy0">.</span>cfi_startproc<br />
&nbsp; &nbsp; leaq &nbsp; &nbsp;33<span class="br0">&#40;</span><span class="sy0">%</span>rdi<span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span>rax &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; inline<br />
&nbsp; &nbsp; imulq &nbsp; $141<span class="sy0">,</span> <span class="sy0">%</span>rax<span class="sy0">,</span> <span class="sy0">%</span>rsi<br />
&nbsp; &nbsp; movq &nbsp; &nbsp;<span class="br0">&#40;</span><span class="sy0">%</span>rdx<span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; movq &nbsp; &nbsp;<span class="br0">&#40;</span><span class="sy0">%</span>rax<span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; cmpq &nbsp; &nbsp;$_ZN2A24fun2El<span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; <span class="kw1">jne</span> <span class="sy0">.</span>L3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt; virtual inline ?<br />
&nbsp; &nbsp; leaq &nbsp; &nbsp;44<span class="br0">&#40;</span><span class="sy0">%</span>rsi<span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; imulq &nbsp; $151<span class="sy0">,</span> <span class="sy0">%</span>rax<span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; <span class="kw1">ret</span><br />
&nbsp; &nbsp; <span class="sy0">.</span>p2align 4<span class="sy0">,,</span>10<br />
&nbsp; &nbsp; <span class="sy0">.</span>p2align 3<br />
<span class="sy0">.</span>L3<span class="sy0">:</span><br />
&nbsp; &nbsp; subq &nbsp; &nbsp;$8<span class="sy0">,</span> <span class="sy0">%</span>rsp<br />
&nbsp; &nbsp; <span class="sy0">.</span>cfi_def_cfa_offset 16<br />
&nbsp; &nbsp; movq &nbsp; &nbsp;<span class="sy0">%</span>rdx<span class="sy0">,</span> <span class="sy0">%</span>rdi<br />
&nbsp; &nbsp; <span class="kw1">call</span> &nbsp; &nbsp;<span class="sy0">*%</span>rax<br />
&nbsp; &nbsp; addq &nbsp; &nbsp;$8<span class="sy0">,</span> <span class="sy0">%</span>rsp<br />
&nbsp; &nbsp; <span class="sy0">.</span>cfi_def_cfa_offset 8<br />
&nbsp; &nbsp; imulq &nbsp; $151<span class="sy0">,</span> <span class="sy0">%</span>rax<span class="sy0">,</span> <span class="sy0">%</span>rax<br />
&nbsp; &nbsp; <span class="kw1">ret</span><br />
&nbsp; &nbsp; <span class="sy0">.</span>cfi_endproc<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
</channel>
</rss>