eliminate_runtime_penalty.html 7.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Eliminating Runtime Penalty</title>
  5. <link rel="stylesheet" href="boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="index.html" title="Safe Numerics">
  8. <link rel="up" href="index.html" title="Safe Numerics">
  9. <link rel="prev" href="tutorial/10.html" title="Programming by Contract is Too Slow">
  10. <link rel="next" href="eliminate_runtime_penalty/2.html" title="Using safe_range and safe_literal">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img href="index.html" height="164px" src="pre-boost.jpg" alt="Library Documentation Index"></td>
  15. <td><h2>Safe Numerics</h2></td>
  16. </tr></table>
  17. <div class="spirit-nav">
  18. <a accesskey="p" href="tutorial/10.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="eliminate_runtime_penalty/2.html"><img src="images/next.png" alt="Next"></a>
  19. </div>
  20. <div class="section">
  21. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  22. <a name="safe_numerics.eliminate_runtime_penalty"></a>Eliminating Runtime Penalty</h2></div></div></div>
  23. <div class="toc"><dl class="toc">
  24. <dt><span class="section"><a href="eliminate_runtime_penalty/2.html">Using safe_range
  25. and safe_literal</a></span></dt>
  26. <dt><span class="section"><a href="eliminate_runtime_penalty/1.html">Using Automatic Type Promotion</a></span></dt>
  27. <dt><span class="section"><a href="eliminate_runtime_penalty/3.html">Mixing Approaches</a></span></dt>
  28. </dl></div>
  29. <p>Up until now, we've mostly focused on detecting when incorrect results
  30. are produced and handling these occurrences either by throwing an exception
  31. or invoking some designated function. We've achieved our goal of detecting
  32. and handling arithmetically incorrect behavior - but at cost of checking
  33. many arithmetic operations at runtime. It is a fact that many C++
  34. programmers will find this trade-off unacceptable. So the question arises as
  35. to how we might minimize or eliminate this runtime penalty.</p>
  36. <p>The first step is to determine what parts of a program might invoke
  37. exceptions. The following program is similar to previous examples but uses a
  38. special exception policy: <a class="link" href="exception_policies.html#safe_numerics.exception_policies.loose_trap_policy"><code class="computeroutput">loose_trap_policy</code></a>.</p>
  39. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  40. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  41. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">exception_policies</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// include exception policies</span>
  42. <span class="keyword">using</span> <span class="identifier">safe_t</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">::</span><span class="identifier">safe</span><span class="special">&lt;</span>
  43. <span class="keyword">int</span><span class="special">,</span>
  44. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">::</span><span class="identifier">native</span><span class="special">,</span>
  45. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">::</span><span class="identifier">loose_trap_policy</span> <span class="comment">// note use of "loose_trap_exception" policy!</span>
  46. <span class="special">&gt;</span><span class="special">;</span>
  47. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">argc</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span> <span class="identifier">argv</span><span class="special">[</span><span class="special">]</span><span class="special">)</span><span class="special">{</span>
  48. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"example 81:\n"</span><span class="special">;</span>
  49. <span class="identifier">safe_t</span> <span class="identifier">x</span><span class="special">(</span><span class="identifier">INT_MAX</span><span class="special">)</span><span class="special">;</span>
  50. <span class="identifier">safe_t</span> <span class="identifier">y</span><span class="special">(</span><span class="number">2</span><span class="special">)</span><span class="special">;</span>
  51. <span class="identifier">safe_t</span> <span class="identifier">z</span> <span class="special">=</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">;</span> <span class="comment">// will fail to compile !</span>
  52. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  53. <span class="special">}</span>
  54. </pre>
  55. <p>Now,
  56. any expression which <span class="emphasis"><em><span class="bold"><strong>might</strong></span></em></span> fail at runtime is flagged with a
  57. compile time error. There is no longer any need for <code class="computeroutput">try/catch</code>
  58. blocks. Since this program does not compile, the <span class="bold"><strong>library absolutely <span class="bold"><strong>guarantees that no
  59. arithmetic expression</strong></span> will yield incorrect results</strong></span>.
  60. Furthermore, it is <span class="bold"><strong>absolutely guaranteed that no
  61. exception will ever be thrown</strong></span>. This is our original goal.</p>
  62. <p>Now all we need to do is make the program compile. There are a couple
  63. of ways to achieve this.</p>
  64. </div>
  65. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  66. <td align="left"></td>
  67. <td align="right"><div class="copyright-footer">Copyright &#169; 2012-2018 Robert Ramey<p><a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">Subject to Boost
  68. Software License</a></p>
  69. </div></td>
  70. </tr></table>
  71. <hr>
  72. <div class="spirit-nav">
  73. <a accesskey="p" href="tutorial/10.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="eliminate_runtime_penalty/2.html"><img src="images/next.png" alt="Next"></a>
  74. </div>
  75. </body>
  76. </html>