<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834127</guid>
        <pubDate>Mon, 22 Aug 2005 15:43:32 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834127</link>
        <description><![CDATA[trainer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=834035'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2005-08-22T14:04:32+00:00">22.08.05, 14:04</time></span><div class='quote '>Он же, но с С++-исключениями</div></div>Судя по листингу, никакой обработки нет - компилятор выкинул.<br>
<br>
Да и с POD-типами не совсем честно. Надо внутрь try засунуть какой-нибудь не-POD тип, например, vector. :) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2005-08-22T19:45:37+04:00">22.08.05, 15:45</time></span></span><br>
меня опередили :)]]></description>
        <author>trainer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834070</guid>
        <pubDate>Mon, 22 Aug 2005 14:39:11 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834070</link>
        <description><![CDATA[Flex Ferrum: Из этого, кстати, следует весьма интересный вывод. Пустой спецификатор исключений - вполне хороший способ избежать оверхеда. Т. е. если нетривиальный метод гарантирует, что не выкинет исключений (гарантия отсутствия ошибок), то имеет смысл помечать его как throw(), что позволит компилятору опимизировать его вызов. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2005-08-22T14:42:25+00:00">22.08.05, 14:42</time></span></span><br>
Вот еще два примера кода. В обоих случаях вызывается метод foo___. Но в первом случае он может кидать любые исключения, а во втором случае помечен как throw().<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;ebp &nbsp;</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; ebp,esp </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFFh </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset __ehhandler$_main (4015A0h) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr fs:[00000000h] </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],esp </div><div class="code_line">sub &nbsp; &nbsp; &nbsp; &nbsp; esp,8 </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;ebx &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; esi,dword ptr [__imp__printf (40206Ch)] </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;edi &nbsp;</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-10h],esp </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020E8h) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-4],0 </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],0FFFFFFFBh </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[a] </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020E8h) </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402070h)] </div><div class="code_line">add &nbsp; &nbsp; &nbsp; &nbsp; esp,10h </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a /= foo___();</div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;foo___ (401000h) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,eax </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr [a] </div><div class="code_line">cdq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">idiv &nbsp; &nbsp; &nbsp; &nbsp;eax,ecx </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020E8h) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],eax </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">add &nbsp; &nbsp; &nbsp; &nbsp; esp,8 </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,dword ptr [ebp-0Ch] </div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; edi &nbsp;</div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; esi &nbsp;</div><div class="code_line">xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],ecx </div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; ebx &nbsp;</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; esp,ebp </div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; ebp &nbsp;</div><div class="code_line">ret &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;catch (...)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;should not be here. Maybe zero d&quot;... (4020BCh) </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (40206Ch)] </div><div class="code_line">add &nbsp; &nbsp; &nbsp; &nbsp; esp,4 </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; eax,offset $L37743 (40108Bh) </div><div class="code_line">ret</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;ecx &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; esi,dword ptr [__imp__printf (40206Ch)] </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020BCh) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [esp+0Ch],0FFFFFFFBh </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[esp+0Ch] </div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020BCh) </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402070h)] </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a /= foo___();</div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;foo___ (401000h) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,eax </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr [esp+14h] </div><div class="code_line">cdq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">idiv &nbsp; &nbsp; &nbsp; &nbsp;eax,ecx </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020BCh) </div><div class="code_line">mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [esp+1Ch],eax </div><div class="code_line">call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">add &nbsp; &nbsp; &nbsp; &nbsp; esp,18h </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;catch (...)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; esi &nbsp;</div><div class="code_line">pop &nbsp; &nbsp; &nbsp; &nbsp; ecx &nbsp;</div><div class="code_line">ret</div></ol></div></div></div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834067</guid>
        <pubDate>Mon, 22 Aug 2005 14:36:54 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834067</link>
        <description><![CDATA[TrefptYc: <strong class='tag-b'>Flex Ferrum</strong><br>
<br>
Ну всё правильно. В твоём первом примере с С++-исключениями по ветке catch(...) пойти не могли, ведь, насколько я помню, С++ обработчтик не перехватывает железные исключения, а софтверных ты не кидал и деления на константук у тебя не было. поэтому компилятор просто убрал обработку исключений, как если бы он убрал конструкцию if(0){}. Так что адекватное практическое знание ещё получить нужно...]]></description>
        <author>TrefptYc</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834061</guid>
        <pubDate>Mon, 22 Aug 2005 14:30:47 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834061</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=834049'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>TrefptYc &#064; <time class="tag-quote__quoted-time" datetime="2005-08-22T14:19:45+00:00">22.08.05, 14:19</time></span><div class='quote '>Дополнение к правилам шикарное, за одним НО.<br>
Есть знание теоретическое и знание практическое. </div></div><br>
Так потому и предлагается спорить не голословно, а с подобающей аргументацией. Кстати, если кто-то соберется выкинуть исключение, то код main начинает выглядеть так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">00401020 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ebp &nbsp;</div><div class="code_line">00401021 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; ebp,esp </div><div class="code_line">00401023 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFFh </div><div class="code_line">00401025 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset __ehhandler$_main (401580h) </div><div class="code_line">0040102A &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr fs:[00000000h] </div><div class="code_line">00401030 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">00401031 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],esp </div><div class="code_line">00401038 &nbsp;sub &nbsp; &nbsp; &nbsp; &nbsp; esp,8 </div><div class="code_line">0040103B &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ebx &nbsp;</div><div class="code_line">0040103C &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">0040103D &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;edi &nbsp;</div><div class="code_line">0040103E &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-10h],esp </div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">00401041 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">00401043 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020E8h) </div><div class="code_line">00401048 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-4],0 </div><div class="code_line">0040104F &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],0FFFFFFFBh </div><div class="code_line">00401056 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (40206Ch)] </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">0040105C &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[a] </div><div class="code_line">0040105F &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">00401060 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020E8h) </div><div class="code_line">00401065 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402070h)] </div><div class="code_line">0040106B &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,10h </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a /= foo___();</div><div class="code_line">0040106E &nbsp;jmp &nbsp; &nbsp; &nbsp; &nbsp; foo___ (401000h) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;catch (...)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">00401073 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;should not be here. Maybe zero d&quot;... (4020BCh) </div><div class="code_line">00401078 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (40206Ch)] </div><div class="code_line">0040107E &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,4 </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">00401081 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,offset $L37751 (401087h) </div><div class="code_line">00401086 &nbsp;ret &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">00401087 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,dword ptr [ebp-0Ch] </div><div class="code_line">0040108A &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; edi &nbsp;</div><div class="code_line">0040108B &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; esi &nbsp;</div><div class="code_line">0040108C &nbsp;xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">0040108E &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],ecx </div><div class="code_line">00401095 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; ebx &nbsp;</div><div class="code_line">00401096 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; esp,ebp </div><div class="code_line">00401098 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; ebp &nbsp;</div><div class="code_line">00401099 &nbsp;ret</div></ol></div></div></div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834049</guid>
        <pubDate>Mon, 22 Aug 2005 14:19:45 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834049</link>
        <description><![CDATA[TrefptYc: <strong class='tag-b'>Flex Ferrum</strong><br>
<br>
Дополнение к правилам шикарное, за одним НО.<br>
Есть знание теоретическое и знание практическое. Может конкретно на этом примере так случилось, что результаты оказались такими неэффективными. А вдруг например на kernel-space или на другом компиляторе картина будет прямо противоположная. Если когда-нибудь занимался попыткамиотносительно точно замерить производительность, то поймёшь... Когда два теста без перекомпиляции но при перезагрузке ОС давали диаметрально разные результаты...]]></description>
        <author>TrefptYc</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834035</guid>
        <pubDate>Mon, 22 Aug 2005 14:04:32 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834035</link>
        <description><![CDATA[Flex Ferrum: Продолжаем эксперемент:<br>
VC 7.1 Код без исключений<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">00401000 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ecx &nbsp;</div><div class="code_line">00401001 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">00401002 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; esi,dword ptr [__imp__printf (402064h)] </div><div class="code_line">00401008 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">0040100A &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020D8h) </div><div class="code_line">0040100F &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [esp+0Ch],0FFFFFFFBh </div><div class="code_line">00401017 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">00401019 &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[esp+0Ch] </div><div class="code_line">0040101D &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">0040101E &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020D8h) </div><div class="code_line">00401023 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402068h)] </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (a &#62; 0)</div><div class="code_line">00401029 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr [esp+14h] </div><div class="code_line">0040102D &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,10h </div><div class="code_line">00401030 &nbsp;test &nbsp; &nbsp; &nbsp; &nbsp;eax,eax </div><div class="code_line">00401032 &nbsp;jle &nbsp; &nbsp; &nbsp; &nbsp; main+3Eh (40103Eh) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">00401034 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;should not be here. Maybe zero d&quot;... (4020ACh) </div><div class="code_line">00401039 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">0040103B &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,4 </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">0040103E &nbsp;xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">00401040 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; esi &nbsp;</div><div class="code_line">00401041 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; ecx &nbsp;</div><div class="code_line">00401042 &nbsp;ret</div></ol></div></div></div></div><br>
Он же, но с С++-исключениями<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">00401000 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ecx &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">00401001 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">00401003 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020ACh) </div><div class="code_line">00401008 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [esp+8],0FFFFFFFBh </div><div class="code_line">00401010 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (402064h)] </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">00401016 &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[esp+8] </div><div class="code_line">0040101A &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">0040101B &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020ACh) </div><div class="code_line">00401020 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402068h)] </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;catch (...)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">00401026 &nbsp;xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">00401028 &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,14h </div><div class="code_line">0040102B &nbsp;ret</div></ol></div></div></div></div><br>
Он же, но с SEH<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void main()</div><div class="code_line">{</div><div class="code_line">00401000 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ebp &nbsp;</div><div class="code_line">00401001 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; ebp,esp </div><div class="code_line">00401003 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFFh </div><div class="code_line">00401005 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;4020E0h </div><div class="code_line">0040100A &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset _except_handler3 (40114Eh) </div><div class="code_line">0040100F &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,dword ptr fs:[00000000h] </div><div class="code_line">00401015 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">00401016 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],esp </div><div class="code_line">0040101D &nbsp;sub &nbsp; &nbsp; &nbsp; &nbsp; esp,0Ch </div><div class="code_line">00401020 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;ebx &nbsp;</div><div class="code_line">00401021 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;esi &nbsp;</div><div class="code_line">00401022 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;edi &nbsp;</div><div class="code_line">00401023 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-18h],esp </div><div class="code_line">&nbsp;&nbsp; &nbsp;//PerformanceTest();</div><div class="code_line">&nbsp;&nbsp; &nbsp;int a = 10;</div><div class="code_line">00401026 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],0Ah </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;__try</div><div class="code_line">0040102D &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-4],0 </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a = 15;</div><div class="code_line">00401034 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],0Fh </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a += 20;</div><div class="code_line">0040103B &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],23h </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a -= 40;</div><div class="code_line">00401042 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [a],0FFFFFFFBh </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;%d&quot;, a );</div><div class="code_line">00401049 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;0FFFFFFFBh </div><div class="code_line">0040104B &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020D8h) </div><div class="code_line">00401050 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (402064h)] </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">00401056 &nbsp;lea &nbsp; &nbsp; &nbsp; &nbsp; eax,[a] </div><div class="code_line">00401059 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;eax &nbsp;</div><div class="code_line">0040105A &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;%d&quot; (4020D8h) </div><div class="code_line">0040105F &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__scanf (402068h)] </div><div class="code_line">00401065 &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,10h </div><div class="code_line">00401068 &nbsp;jmp &nbsp; &nbsp; &nbsp; &nbsp; $L39474+11h (401081h) </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;__except(EXCEPTION_EXECUTE_HANDLER)</div><div class="code_line">0040106A &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; eax,1 </div><div class="code_line">$L39481:</div><div class="code_line">0040106F &nbsp;ret &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">$L39474:</div><div class="code_line">00401070 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; esp,dword ptr [ebp-18h] </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">00401073 &nbsp;push &nbsp; &nbsp; &nbsp; &nbsp;offset string &quot;should not be here. Maybe zero d&quot;... (4020ACh) </div><div class="code_line">00401078 &nbsp;call &nbsp; &nbsp; &nbsp; &nbsp;dword ptr [__imp__printf (402064h)] </div><div class="code_line">0040107E &nbsp;add &nbsp; &nbsp; &nbsp; &nbsp; esp,4 </div><div class="code_line">00401081 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr [ebp-4],0FFFFFFFFh </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">}</div><div class="code_line">00401088 &nbsp;xor &nbsp; &nbsp; &nbsp; &nbsp; eax,eax </div><div class="code_line">0040108A &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; ecx,dword ptr [ebp-10h] </div><div class="code_line">0040108D &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; dword ptr fs:[0],ecx </div><div class="code_line">00401094 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; edi &nbsp;</div><div class="code_line">00401095 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; esi &nbsp;</div><div class="code_line">00401096 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; ebx &nbsp;</div><div class="code_line">00401097 &nbsp;mov &nbsp; &nbsp; &nbsp; &nbsp; esp,ebp </div><div class="code_line">00401099 &nbsp;pop &nbsp; &nbsp; &nbsp; &nbsp; ebp &nbsp;</div><div class="code_line">0040109A &nbsp;ret</div></ol></div></div></div></div><br>
<br>
Что называется, почувствуйте разницу... <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2005-08-22T14:12:36+00:00">22.08.05, 14:12</time></span></span><br>
В связи с чем предлагаю следующее дополнение к правилам раздела:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Если кто-то берется утвержать, что та или иная языковая конструкция неэффективна, неоптимальна, просаживает производительность кода,  и т. д. и т. п., то любое такое утверждение должно быть подкреплено не только кодом на С++, но и ассемблерным листингом (полученным по приведенному коду), иллюстрирующим утверждение, замерами производительности или любыми другими весомыми доказательствами. Иначе имеет смысл сразу же закрывать тему за недоказанностью &quot;обвинений&quot;.<br>
</div></div>]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834013</guid>
        <pubDate>Mon, 22 Aug 2005 13:37:06 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=834013</link>
        <description><![CDATA[TrefptYc: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=833935'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>x0ras &#064; <time class="tag-quote__quoted-time" datetime="2005-08-22T12:07:23+00:00">22.08.05, 12:07</time></span><div class='quote '>Накладные расходы всегда появляются при использовании исключений во время выполнения программы, а не только при возникновении исключительных ситуаций. Я вижу смысл использовать исключения только в отладочной версии, т.к. в моем случае в релизе они бесполезны. Сейчас мне в голову приходит только одно решение - написать такой код, который бы в отладочной версии проводил проверки и выбрасывал/перехватывал исключения, а в релизе все проверки убивались.</div></div><br>
Насчёт накладных расходов. Решила наконец, что If in doubt, check it out<br>
Сравниваем.<br>
<br>
Проект без SEH<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">PUBLIC &nbsp;_main</div><div class="code_line">PUBLIC &nbsp;??_C@_02DPKJAMEF@?$CFd?$AA@ &nbsp; &nbsp; &nbsp; &nbsp; ; `string&#39;</div><div class="code_line">PUBLIC &nbsp;??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@ ; `string&#39;</div><div class="code_line">EXTRN &nbsp; _printf:NEAR</div><div class="code_line">EXTRN &nbsp; _scanf:NEAR</div><div class="code_line">; &nbsp; COMDAT ??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">; File d:\myprojectstesttest.cpp</div><div class="code_line">CONST &nbsp; SEGMENT</div><div class="code_line">??_C@_02DPKJAMEF@?$CFd?$AA@ DB &#39;%d&#39;, 00H &nbsp; &nbsp; &nbsp; &nbsp;; `string&#39;</div><div class="code_line">CONST &nbsp; ENDS</div><div class="code_line">; &nbsp; COMDAT ??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@</div><div class="code_line">CONST &nbsp; SEGMENT</div><div class="code_line">??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@ DB &#39;should no&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DB &nbsp;&#39;t be here. Maybe zero division?&#39;, 00H &nbsp;; `string&#39;</div><div class="code_line">; Function compile flags: /Ogty</div><div class="code_line">CONST &nbsp; ENDS</div><div class="code_line">; &nbsp; COMDAT _main</div><div class="code_line">_TEXT &nbsp; SEGMENT</div><div class="code_line">_a$ = -4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; size = 4</div><div class="code_line">_main &nbsp; PROC NEAR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; COMDAT</div><div class="code_line">&nbsp;</div><div class="code_line">; 8 &nbsp; &nbsp;: {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;ecx</div><div class="code_line">&nbsp;</div><div class="code_line">; 9 &nbsp; &nbsp;: &nbsp; &nbsp; int a = 10;</div><div class="code_line">; 10 &nbsp; : &nbsp; &nbsp; a = 15;</div><div class="code_line">; 11 &nbsp; : &nbsp; &nbsp; a += 20;</div><div class="code_line">; 12 &nbsp; : &nbsp; &nbsp; a -= 40;</div><div class="code_line">; 13 &nbsp; : &nbsp; &nbsp; printf( &quot;%d&quot;, a );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;-5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; fffffffbH</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR _a$[esp+12], -5 &nbsp; &nbsp; &nbsp; ; fffffffbH</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_printf</div><div class="code_line">&nbsp;</div><div class="code_line">; 14 &nbsp; : &nbsp; &nbsp; scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea eax, DWORD PTR _a$[esp+12]</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_scanf</div><div class="code_line">&nbsp;</div><div class="code_line">; 15 &nbsp; : &nbsp; &nbsp; if( a &#62; 0 )</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, DWORD PTR _a$[esp+20]</div><div class="code_line">&nbsp;&nbsp; &nbsp;add esp, 16 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 00000010H</div><div class="code_line">&nbsp;&nbsp; &nbsp;test &nbsp; &nbsp;eax, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;jle SHORT $L58684</div><div class="code_line">&nbsp;</div><div class="code_line">; 16 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_printf</div><div class="code_line">&nbsp;&nbsp; &nbsp;add esp, 4</div><div class="code_line">$L58684:</div><div class="code_line">&nbsp;</div><div class="code_line">; 17 &nbsp; : &nbsp; &nbsp; return 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, eax</div><div class="code_line">&nbsp;</div><div class="code_line">; 18 &nbsp; : }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret 0</div><div class="code_line">_main &nbsp; ENDP</div><div class="code_line">_TEXT &nbsp; ENDS</div><div class="code_line">END</div></ol></div></div></div></div><br>
<br>
<br>
А теперь c SEH( ветка, которая раньше была в обработчике IF вынесена в EXCEPT_HANDLER  Проект скомпилирован с теми же стандартными настройками на VS .NET<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">PUBLIC &nbsp;_main</div><div class="code_line">PUBLIC &nbsp;??_C@_02DPKJAMEF@?$CFd?$AA@ &nbsp; &nbsp; &nbsp; &nbsp; ; `string&#39;</div><div class="code_line">PUBLIC &nbsp;??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@ ; `string&#39;</div><div class="code_line">EXTRN &nbsp; _printf:NEAR</div><div class="code_line">EXTRN &nbsp; _scanf:NEAR</div><div class="code_line">EXTRN &nbsp; __except_handler3:NEAR</div><div class="code_line">EXTRN &nbsp; __except_list:DWORD</div><div class="code_line">; &nbsp; COMDAT CONST</div><div class="code_line">; File d:\myprojectstesttest.cpp</div><div class="code_line">CONST &nbsp; SEGMENT</div><div class="code_line">$T58689 DD &nbsp;0ffffffffH</div><div class="code_line">&nbsp;&nbsp; &nbsp;DD &nbsp;FLAT:$L58683</div><div class="code_line">&nbsp;&nbsp; &nbsp;DD &nbsp;FLAT:$L58684</div><div class="code_line">CONST &nbsp; ENDS</div><div class="code_line">; &nbsp; COMDAT ??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">CONST &nbsp; SEGMENT</div><div class="code_line">??_C@_02DPKJAMEF@?$CFd?$AA@ DB &#39;%d&#39;, 00H &nbsp; &nbsp; &nbsp; &nbsp;; `string&#39;</div><div class="code_line">CONST &nbsp; ENDS</div><div class="code_line">; &nbsp; COMDAT ??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@</div><div class="code_line">CONST &nbsp; SEGMENT</div><div class="code_line">??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@ DB &#39;should no&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DB &nbsp;&#39;t be here. Maybe zero division?&#39;, 00H &nbsp;; `string&#39;</div><div class="code_line">; Function compile flags: /Ogty</div><div class="code_line">CONST &nbsp; ENDS</div><div class="code_line">; &nbsp; COMDAT _main</div><div class="code_line">_TEXT &nbsp; SEGMENT</div><div class="code_line">_a$ = -28 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; size = 4</div><div class="code_line">[COLOR=red]__$SEHRec$ = -24 [/COLOR] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; size = 24</div><div class="code_line">_main &nbsp; PROC NEAR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; COMDAT</div><div class="code_line">&nbsp;</div><div class="code_line">; 8 &nbsp; &nbsp;: {</div><div class="code_line">&nbsp;</div><div class="code_line">[COLOR=red] push &nbsp; &nbsp;ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ebp, esp</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:$T58689</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:__except_handler3</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov eax, DWORD PTR fs:__except_list</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR fs:__except_list, esp</div><div class="code_line">&nbsp;&nbsp; &nbsp;sub esp, 12 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 0000000cH</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR __$SEHRec$[ebp], esp[/COLOR]</div><div class="code_line">; 9 &nbsp; &nbsp;: &nbsp; &nbsp; int a = 10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR _a$[ebp], 10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; 0000000aH</div><div class="code_line">&nbsp;</div><div class="code_line">; 10 &nbsp; : &nbsp; &nbsp; __try</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;[COLOR=red]mov &nbsp;DWORD PTR __$SEHRec$[ebp+20], 0[/COLOR]</div><div class="code_line">&nbsp;</div><div class="code_line">; 11 &nbsp; : &nbsp; &nbsp; {</div><div class="code_line">; 12 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; a = 15;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR _a$[ebp], 15 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; 0000000fH</div><div class="code_line">&nbsp;</div><div class="code_line">; 13 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; a += 20;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR _a$[ebp], 35 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; 00000023H</div><div class="code_line">&nbsp;</div><div class="code_line">; 14 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; a -= 40;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR _a$[ebp], -5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; fffffffbH</div><div class="code_line">&nbsp;</div><div class="code_line">; 15 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; printf( &quot;%d&quot;, a );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;-5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; fffffffbH</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_printf</div><div class="code_line">&nbsp;</div><div class="code_line">; 16 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; scanf( &quot;%d&quot;, &amp;a );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lea eax, DWORD PTR _a$[ebp]</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_02DPKJAMEF@?$CFd?$AA@</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_scanf</div><div class="code_line">&nbsp;&nbsp; &nbsp;add esp, 16 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 00000010H</div><div class="code_line">&nbsp;&nbsp; &nbsp;jmp SHORT $L58693</div><div class="code_line">$L58683:</div><div class="code_line">&nbsp;</div><div class="code_line">; 17 &nbsp; : &nbsp; &nbsp; }</div><div class="code_line">; 18 &nbsp; : &nbsp; &nbsp; __except(EXCEPTION_EXECUTE_HANDLER)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;[COLOR=red]mov &nbsp;eax, 1</div><div class="code_line">$L58685:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret 0</div><div class="code_line">$L58684:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov esp, DWORD PTR __$SEHRec$[ebp][/COLOR]</div><div class="code_line">; 19 &nbsp; : &nbsp; &nbsp; {</div><div class="code_line">; 20 &nbsp; : &nbsp; &nbsp; &nbsp; &nbsp; printf( &quot;should not be here. Maybe zero division?&quot; );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push &nbsp; &nbsp;OFFSET FLAT:??_C@_0CJ@LGAHIOIG@should?5not?5be?5here?4?5Maybe?5zero?5d@</div><div class="code_line">&nbsp;&nbsp; &nbsp;call &nbsp; &nbsp;_printf</div><div class="code_line">&nbsp;&nbsp; &nbsp;add esp, 4</div><div class="code_line">$L58693:</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR __$SEHRec$[ebp+20], -1</div><div class="code_line">&nbsp;</div><div class="code_line">; 21 &nbsp; : &nbsp; &nbsp; }</div><div class="code_line">; 22 &nbsp; : &nbsp; &nbsp; return 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, eax</div><div class="code_line">&nbsp;</div><div class="code_line">; 23 &nbsp; : }</div><div class="code_line">&nbsp;</div><div class="code_line">[COLOR=red] mov ecx, DWORD PTR __$SEHRec$[ebp+8]</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov DWORD PTR fs:__except_list, ecx</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop edi</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop esi</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ebx</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov esp, ebp</div><div class="code_line">&nbsp;&nbsp; &nbsp;pop ebp[/COLOR] ret 0</div><div class="code_line">_main &nbsp; ENDP</div><div class="code_line">_TEXT &nbsp; ENDS</div><div class="code_line">END</div></ol></div></div></div></div><br>
<br>
Бросаются в глаза две вещи:<br>
1) большие накладные расходы на начало&#092;завершение функции, где используются исключения<br>
2) то, что оптимизация при использовании SEH, если и не отключается, то сильно сдаёт.<br>
<br>
2-ое мне откровенно непонятно, в то время как первое заставило иначе взглянуть на своё использовании исключений. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>-юсртыхэю <time class="tag-mergetime" datetime="2005-08-22T13:44:37+00:00">22.08.05, 13:44</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=833154'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2005-08-21T15:41:06+00:00">21.08.05, 15:41</time></span><div class='quote '>Раскрутка стека программы операционной системой затруднена хотя бы потому, что программа может использовать какую-то свой, не определённый в системе метод хранения необходимой информации. А так и получится, если программа строится компилятором/сборщиком сторонних фирм, а не создателя ОС. В случае с Windows это особенно актуально, так как MS известна своим пристрастием включать в свои ОС недокументированные возможности.</div></div><br>
Но многие используют VisualStudio, который вполне от производителя ОС. А Borland тоже получил какое-то тайное знания от Microsoft касательно того, как реализовать обработку исключений ( по крайней мере, Matt Pietrek так считал ). Что же до Intel-овского компилятора, то у них замечательная дружба с Microsoft и они лучше многих знают внутренние структуры ( посмотреть хотя бы на VTune ). А какие ещё компиляторы популярны под Windows, чтобы считать эту проблему актуальной?]]></description>
        <author>TrefptYc</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=833935</guid>
        <pubDate>Mon, 22 Aug 2005 12:07:23 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=833935</link>
        <description><![CDATA[x0ras: Накладные расходы всегда появляются при использовании исключений во время выполнения программы, а не только при возникновении исключительных ситуаций. Я вижу смысл использовать исключения только в отладочной версии, т.к. в моем случае в релизе они бесполезны. Сейчас мне в голову приходит только одно решение - написать такой код, который бы в отладочной версии проводил проверки и выбрасывал/перехватывал исключения, а в релизе все проверки убивались.]]></description>
        <author>x0ras</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=833154</guid>
        <pubDate>Sun, 21 Aug 2005 15:41:06 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=833154</link>
        <description><![CDATA[amk: Вообще-то аппаратные исключения по стандарту языка C++ как бы и не совсем исключения. По крайней мере их перехват затруднён. Думаю часто хватило бы просто возможности оповестить программу о возникновении такой ситуации.<br>Раскрутка стека программы операционной системой затруднена хотя бы потому, что программа может использовать какую-то свой, не определённый в системе метод хранения необходимой информации. А так и получится, если программа строится компилятором/сборщиком сторонних фирм, а не создателя ОС. В случае с Windows это особенно актуально, так как MS известна своим пристрастием включать в свои ОС недокументированные возможности.]]></description>
        <author>amk</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=832542</guid>
        <pubDate>Sat, 20 Aug 2005 01:19:13 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=832542</link>
        <description><![CDATA[Sanek: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Что значит, обработка исключений встроена в систему? И как это может отражаться на производительности?</div></div><br>
Обработка исключений встроена в систему значит то, что система берет на себя обязанность (или часть обязанности) по раскрутке стека. Также система рпедоставляет функции для программного выкидывания исключений. <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>а) исключительная ситуации в программе перехватывается операционной системой, то даже не знаю как из этой ситуации выбираться, так как выглядит она совершенно неуправляемой;</div></div><br>
Именно операционной системой она и перехватывается. По крайней мере для аппаратных исключений. Аппаратные исключения по сути есть прерывания процессора. Подозреваю, что и программные исключения тоже могут ими являться, хотя могут просто вызываться соответствующие обработчики.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '> Когда вы пишите __try/__except или try/catch, то компилятор создаёт на стеке структуру EXCEPTION_REGISTRATION и добавляет ваш обработчик в список. Таким образом, при использовании исключений у вас чуть увеличивается объём использованного стека и добавляется пара ассемблерных команд в духе</div></div><br>
 :yes:<br>
А если учесть, что во всей программе всего несколько блоков try/catch, то издержки несущественны. Более того, обычно программа без использования исключений строится следующим способом:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int f1_1() {</div><div class="code_line">...</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int f1_2() {</div><div class="code_line">...</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int f1_3() {</div><div class="code_line">...</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int f2_1() {</div><div class="code_line">if(!f1_1())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">if(!f1_2())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">if(!f1_3())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int f2_2() {</div><div class="code_line">if(!f1_1())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">if(!f1_2())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">if(!f1_3())</div><div class="code_line">&nbsp;&nbsp; &nbsp;// return error;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int f() {</div><div class="code_line">if(!f2_1()) {</div><div class="code_line">&nbsp;&nbsp; // return error;</div><div class="code_line">if(!f2_2())</div><div class="code_line">&nbsp;&nbsp; // return error;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ...</div><div class="code_line">}</div></ol></div></div></div></div><br>
Суть в том, что у нас много вложенных вызовов (обычно &quot;высокоуровневые&quot; функции обращаются к функциям &quot;более низкого уровня&quot;), и в каждом случае значение проверяется с помощью if. Количество этих проверок несравнимо больше, чем количество блоков try/catch. При этом операция условного перехода заметно влияет на производительность (по сравнению с mov, например). При использовании исключений проверка ошибок с помощью if присутсвтует только на самом &quot;нижнем&quot; уровне. Остальным функциям в большинстве случаев это не требуется.<br>
<br>
Далее, если всё-таки вываливается исключение. Тут говорить нечего, конечно это накладно по сравнению с проверкой условия. НО&#33; После выброса исключения обычно задумываться о производительности не приходится. Исключения составляют, пожалуй, лишь программы, обслуживающие много пользователей, в ходе выполнения которых возникает нехватка системных ресурсов (памяти, например), и надо обеспечить остальным пользователям (которым хватило ресурсов) быстрое выполнение. Однако в таких случаях разумнее установить настраиваемое ограничение на количество пользователей/ресрусов, т. к. например Windows при нехватке памяти может просто убить процесс без всяких исключений.<br>
<br>
Кроме того, используя аппаратные исключения SEH (ошибки доступа к памяти), можно нашаманить более быстрое приложение, которое работает с большими объемами данных (пример у Рихтера).]]></description>
        <author>Sanek</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=831406</guid>
        <pubDate>Thu, 18 Aug 2005 15:20:18 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=831406</link>
        <description><![CDATA[amk: Что значит, обработка исключений встроена в систему? И как это может отражаться на производительности?<br>
<br>
Если<br>
а) исключительная ситуации в программе перехватывается операционной системой, то даже не знаю как из этой ситуации выбираться, так как выглядит она совершенно неуправляемой;<br>
б) при возникновении исключительной ситуации программа выполняет системный вызов для размотки стека, тогда вижу две основные проблемы: первая, системный вызов - это неизбежная потеря времени, при том что ОС не может выполнить связанную с ситуацией работу быстрее, чем сама программа; вторая, в ОС вынужденно встраиваются обработчики исключительных ситуаций всех языков, допускающих обработку исключений, что увеличивает её размер и делает её ещё неповоротливей.<br>
в) система обнаруживает исключительные ситуации во время системных вызовов и предупреждает о них вызывающую программу, что позволяет последней адекватно реагировать на ошибки, ну это делали все операционные системы, чуть ли не с момента появления самого понятия &quot;операционная система&quot;. Или к разработчикам Windows эта очевидная мысль пришла только сейчас?<br>
В DOS такой механизм действовал.<br>
г) система позволяет выбрасывать исключения из Callback-функций, корректно обрабатывая их. Идея выглядит здраво, но по некотором размышлении её придётся ограничить, чтобы выбрасывать можно было определённое множество исключений.<br>
<br>
Таким образом определённо бракуются <em class='tag-i'>а</em> и <em class='tag-i'>б</em>, нормально поддерживается <em class='tag-i'>в</em> и частично <em class='tag-i'>г</em>.<br>
Лично я стараюсь избегать исключений, анализируя ситуацию заранее. Если например я знаю, что функция не обрабатывает отрицательных параметров, то для обработки их создаю альтернативную ветку, а не перехватываю исключение, даже если оно из неё выбрасывается.]]></description>
        <author>amk</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=830395</guid>
        <pubDate>Wed, 17 Aug 2005 18:36:22 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=830395</link>
        <description><![CDATA[MinLexx: В SEH в Win32 <strong class='tag-b'>ЕСТЬ</strong> раскрутка стека... Компилятор MSVC++ даже стандартные исключения С++ (throw, catch) преобразует в вызовы _try, _except. З.Ы. я точно не помню, как именно, надо перечитать Джеффри Рихтера  :P]]></description>
        <author>MinLexx</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828675</guid>
        <pubDate>Tue, 16 Aug 2005 09:27:11 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828675</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=828524'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>TrefptYc &#064; <time class="tag-quote__quoted-time" datetime="2005-08-16T07:41:38+00:00">16.08.05, 07:41</time></span><div class='quote '>И как это нет раскрутки стека или деструкторов? А если обработчик вызывается с флагом EH_UNWINDING</div></div><br>
Ну, значит я отстал от жизни.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828524</guid>
        <pubDate>Tue, 16 Aug 2005 07:41:38 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828524</link>
        <description><![CDATA[TrefptYc: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=828490'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Flex Ferrum &#064; <time class="tag-quote__quoted-time" datetime="2005-08-16T07:10:55+00:00">16.08.05, 07:10</time></span><div class='quote '>Проблема в другом - это не C++-ные исключения. А потому при их выстреливании никаких побочных эффектов, гарантированных для исключений С++ (как то раскрутка стека, вызов деструкторов и т. п.) не происходит.</div></div><br>
Позвольте, позвольте&#33;<br>
Выдержка из одной из статей Мэтта Питрика (Matt Pietrek) касательно SEH.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>I&#39;m going to avoid the issue of true C++ exception handling, which uses catch() instead of _except. Under the hood, true C++ exception handling is implemented very similarly to what I&#39;ll describe here</div></div><br>
<br>
И как это нет раскрутки стека или деструкторов? А если обработчик вызывается с флагом EH_UNWINDING<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>What does EH_UNWINDING mean? When an exception callback is invoked with the EH_UNWINDING flag, the operating system is giving the handler function an opportunity to do any cleanup it needs to do. What sort of cleanup? A perfect example is that of a C++ class destructor. When a function&#39;s exception handler declines to handle an exception, control typically doesn&#39;t exit from that function in a normal manner. Now, consider a function with a C++ class declared as a local variable. The C++ specification says that the destructor must be called. The exception handler callback with the EH_UNWINDING flag is the opportunity for the function to do cleanup work such as invoking destructors and _finally blocks.</div></div>]]></description>
        <author>TrefptYc</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828490</guid>
        <pubDate>Tue, 16 Aug 2005 07:10:55 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828490</link>
        <description><![CDATA[Flex Ferrum: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=828338'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>TrefptYc &#064; <time class="tag-quote__quoted-time" datetime="2005-08-16T03:51:58+00:00">16.08.05, 03:51</time></span><div class='quote '>Если говорить о программировании под Windows, то там обработка исключений настолько встроена в систему ( SEH ), что 1) гарантируется минимум накладных расходов, 2)даже если вы сами не используете исключения, определённые структуры для их обработки всё равно поддерживаются. </div></div><br>
Проблема в другом - это не C++-ные исключения. А потому при их выстреливании никаких побочных эффектов, гарантированных для исключений С++ (как то раскрутка стека, вызов деструкторов и т. п.) не происходит.]]></description>
        <author>Flex Ferrum</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828484</guid>
        <pubDate>Tue, 16 Aug 2005 07:08:20 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828484</link>
        <description><![CDATA[Sazabis: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=827892'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Lucifer &#064; <time class="tag-quote__quoted-time" datetime="2005-08-15T13:40:02+00:00">15.08.05, 13:40</time></span><div class='quote '>Чем? При каком компиляторе? </div></div><br>
компилятор не важен, а чем, тут уже лучше меня написли.<br>
сдаеться мне, автор и сам понимает это.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=827681'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>x0ras &#064; <time class="tag-quote__quoted-time" datetime="2005-08-15T11:11:59+00:00">15.08.05, 11:11</time></span><div class='quote '>Как уменьшить потери при использовании исключений?</div></div><br>
<br>
Вопрос в скорости, позволят ли современные машины обрабатывать код с исключениями быстро ? Тут уже дело перформенс тестов: допустимо такое время или нет. А потери всегда будут равноценными, при наличии одного кол-ва обработчиков, для ветви кода &lt;- имхо. Или есть другие мнения ?]]></description>
        <author>Sazabis</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828338</guid>
        <pubDate>Tue, 16 Aug 2005 03:51:58 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=828338</link>
        <description><![CDATA[TrefptYc: Если говорить о программировании под Windows, то там обработка исключений настолько встроена в систему ( SEH ), что 1) гарантируется минимум накладных расходов, 2)даже если вы сами не используете исключения, определённые структуры для их обработки всё равно поддерживаются. Всё равно в TEB каждого thread-а есть EXCEPTION_REGISTRATION - список обработчиков исключений. Когда вы пишите __try/__except или try/catch, то компилятор создаёт на стеке структуру EXCEPTION_REGISTRATION и добавляет ваш обработчик в список. Таким образом, при использовании исключений у вас чуть увеличивается объём использованного стека и добавляется пара ассемблерных команд в духе <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">_asm move fs[off_EXCEPTION_REGISTRATION], handler_addr</div></ol></div></div></div></div><br>
Моё утверждение следующее: пока не происходит исключение, почти нет потери производительности. Практический пример - видела тысячу и одну рекоммендацию драйверистам касательно использования SEH-а, а вряд ли кто станет возражать, что в драйвере, да ещё в обработчиках ISR-ов, время является весьма критичным ресурсом.<br>
Возможно, я некорректно понимаю, и в данной теме под использованием механизма исключений подразумевалась не обработка экстренных ситуаций и не разовые переходы ( как-то при завершении программы ), а именно регулярное использование исключений для передачи управления на другой уровень программы?]]></description>
        <author>TrefptYc</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827911</guid>
        <pubDate>Mon, 15 Aug 2005 13:55:59 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827911</link>
        <description><![CDATA[BugHunter: Давайте по порядку.<br><br>1) если исключения не возникают, то прога практически не тормозится<br>2) исключения В ЛЮБОМ СЛУЧАЕ будут медленне нежели обычная проверка возвращаемого значения. х0ras-а интересует, как повысить производительность. Ответ - практически никак. Писать свои исключения, менеджеры памяти и т.д. Это связано прежде всего с кодом, который генерируется для &quot;отката&quot;. В теневой стек должны быть записаны адреса объектов, которые должны быть разрушены при ненормальной раскрутке. Это процесс довольно быстрый, но он в любом случае занимает ненулевое время.<br>3) раскрутка стека. Само исключение так же живёт не в стеке (хотя бывает, и живёт, в отдельных реализациях), чаще всего они лежат либо в теневом стеке, либо в куче. А с ними операции тоже не самые быстрые.<br>4) исключения - это шаг, на который можно и нужно идти, по крайней мере, на этапе отладки. Нп, написать что нибудь типа функций/макросов check_value(), которые в релиз версии должны быть заменены на пустые значения.<br>5) проверка возвращаемых значений - это прекрасно, т.к. быстрее неё ничего не будет. Но... они хороши в индивидуальной разработке. Когда ты реально можешь грамотно и польностью протестировать весь написаный код. В коммандной разработке часто используются подобные check_value.]]></description>
        <author>BugHunter</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827892</guid>
        <pubDate>Mon, 15 Aug 2005 13:40:02 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827892</link>
        <description><![CDATA[Lucifer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=827879'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Sazabis &#064; <time class="tag-quote__quoted-time" datetime="2005-08-15T13:33:18+00:00">15.08.05, 13:33</time></span><div class='quote '>Цитата (artalex @ Сегодня, 17:23)<br>
Так что иногда исключения могут оказаться быстрее, чем проверки возвращаемого значения.<br>
не могут. сколько раз писалось, даже если они не возникают, они тормозят прогу. </div></div><br>
Чем? При каком компиляторе?]]></description>
        <author>Lucifer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827879</guid>
        <pubDate>Mon, 15 Aug 2005 13:33:18 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827879</link>
        <description><![CDATA[Sazabis: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=111428&view=findpost&p=827861'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>artalex &#064; <time class="tag-quote__quoted-time" datetime="2005-08-15T13:23:39+00:00">15.08.05, 13:23</time></span><div class='quote '>Так что иногда исключения могут оказаться быстрее, чем проверки возвращаемого значения.</div></div><br>
не могут. сколько раз писалось, даже если они не возникают, они тормозят прогу.]]></description>
        <author>Sazabis</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827861</guid>
        <pubDate>Mon, 15 Aug 2005 13:23:39 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827861</link>
        <description><![CDATA[artalex: <strong class='tag-b'>x0ras</strong><br>
Исключения, конечно, снижают производительность. Но не нужно забывать о том, что исключения, в идеале, должны возникать не слишком часто. А если исключения не использовать, то придется каждый вызов функции обрамлять операторами проверки возвращаемого значения, причем эти операторы будут работать всегда, а исключение только во время возникновения ошибки. Так что иногда исключения могут оказаться быстрее, чем проверки возвращаемого значения. Ну, а про читабельность кода я уже не говорю...]]></description>
        <author>artalex</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827749</guid>
        <pubDate>Mon, 15 Aug 2005 12:11:42 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827749</link>
        <description><![CDATA[Axis: Сейчас сам пишу 3D графический движок, отказался от исключений вообще, производительность снижается заметно, гораздо лучше использовать возвращаемые значения о состоянии выпонения функции. Сам довольно мало испытывал исключения, так как я любитель наиболее оптимального кода и стараюсь использовать вставки на асемблере по максимуму (если это не очень сильно снижает скорость разработки программы).]]></description>
        <author>Axis</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827681</guid>
        <pubDate>Mon, 15 Aug 2005 11:11:59 +0000</pubDate>
        <title>Исключения и производительность</title>
        <link>https://forum.sources.ru/index.php?showtopic=111428&amp;view=findpost&amp;p=827681</link>
        <description><![CDATA[x0ras: Очень много писалось и говорилось об исключениях и производительности, но время бежит, а мощности ростут, компиляторы и язык совершенствуются.<br>Как уменьшить потери при использовании исключений? Возможно ли? Интересует в первую очередь практическая сторона. Возможно кто-то уже решал подобные задачи, проводил тесты и т.д. Может кому-то пришлось отказаться от исключений вовсе?<br>Хотелось бы обсудить (именно обсудить, а не разводить очередной холивар) все возможные решения проблемы.]]></description>
        <author>x0ras</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	