Refine "Choosing between endian types and endian conversion functions" docs.

This commit is contained in:
Beman
2014-11-14 09:52:44 -05:00
parent fd1ab6daff
commit 31f930330d
2 changed files with 32 additions and 10 deletions

View File

@@ -163,42 +163,63 @@ application needs.</p>
<tr> <tr>
<td valign="top"> <td valign="top">
<ul> <ul>
<li><p>A need to save overall time when I/O time is more important than
numeric variable CPU time.</p></li>
<li><p>A need to simplify program logic and eliminate logic <li><p>A need to simplify program logic and eliminate logic
errors. Since the endian types mimic the built-in types, there is no need to reason about the current endianness of variables errors. Since the endian types mimic the built-in types, there is no need to reason about the current endianness of variables
and that can simplify program logic and eliminate logic errors.</p></li> and that can simplify program logic and eliminate logic errors.</p></li>
<li><p>A need to use unusual integer sizes (i.e. 3, 5, <li><p>A need to use unusual integer sizes (i.e. 3, 5,
6, or 7 bytes) to reduce internal and external space usage and 6, or 7 bytes) to reduce internal and external space usage and
save I/O time.</li> save I/O time.</li>
<li><p>A need to use unaligned variables. Endian types can eliminate padding bytes in <li><p>A need to portably use unaligned variables or eliminate padding bytes in
structures, reducing internal and external space usage and saving I/O structures, either to save I/O time by reducing internal and external space usage,
time. They can deals with structures defined like this: or to conform to a data layout over which you have no control. For
example, the structure below relies on a compiler extension, so is
non-portable, and operations on S::b will fail on hardware platforms that
require 32-bit alignment.
<blockquote> <blockquote>
<p><code>struct S {<br> <p><code>struct S {<br>
&nbsp; uint16_t a;<br> &nbsp; uint16_t a;<br>
&nbsp; uint32_t b;<br> &nbsp; uint32_t b;<br>
} __attribute__ ((packed));</code> } __attribute__ ((packed));</code>
</blockquote></p></li> </p></blockquote>
<p>These problems are eliminated by defining S like this:</p>
<blockquote>
<p><code>struct S {<br>
&nbsp; big_uint16_t a;<br>
&nbsp; big_uint32_t b;<br>
};</code>
</p></blockquote>
</li>
<li> <li>
<p>Programmer preference.</p></li> <p>Programmer preference.</p></li>
</ul> </ul>
</td> </td>
<td valign="top"> <td valign="top">
<ul> <ul>
<li><p>A need to leverage knowledge of developers who have been using C byte <li>A need to save overall time when numeric variable CPU use time is more
swapping important that I/O time.</li>
functions for years.</p></li>
<li>A need to save CPU time when a variable is used many times
relative to its I/O.</li>
<li> <li>
<p>A need to pass structures to third-party libraries expecting a <p>A need to pass structures to third-party libraries expecting a
specific structure format.</li> specific structure format.</li>
<li> <li>
<p>A need to leverage knowledge of developers who have been using C byte
swapping
functions for years.</li>
<li>
<p>Programmer preference.</li> <p>Programmer preference.</li>
</ul> </ul>
</td> </td>
</tr> </tr>
</table> </table>
<p><b>Warning:</b> Endian conversion functions are dangerous unless the current
endianness of a variable is always known. For example, if an exception is thrown
and there is no way in a catch block to know a variable&#39;s current endianness,
then any use of that variable including I/O is inherently unsafe. This danger is
not limited to exceptions; all uses of a variable whose endianness is unknown
are unsafe, period.</p>
<h2>Built-in support for <a name="Intrinsic">Intrinsic</a>s</h2> <h2>Built-in support for <a name="Intrinsic">Intrinsic</a>s</h2>
<p>Recent compilers, including GCC, Clang, and Microsoft, supply built-in support for byte swapping <p>Recent compilers, including GCC, Clang, and Microsoft, supply built-in support for byte swapping
intrinsics. Such support is automatically detected and intrinsics. Such support is automatically detected and

View File

@@ -29,7 +29,8 @@ integer/float type and endian conversion approaches to the common use
case scenarios, and provide guidelines for choosing the most appropriate case scenarios, and provide guidelines for choosing the most appropriate
approach in user's applications.</b></p> approach in user's applications.</b></p>
<blockquote> <blockquote>
<p>&nbsp;</p> <p>Done. See <a href="index.html#Choosing">Choosing between endian types and
endian conversion functions</a>.</p>
</blockquote> </blockquote>
<p><b>Conversion functions supplying results via return should be provided.</b></p> <p><b>Conversion functions supplying results via return should be provided.</b></p>
<blockquote> <blockquote>