📄 impdet5.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="GENERATOR" content="Quadralay WebWorks Publisher Professional Edition 6.0.5">
<meta name="TEMPLATEBASE" content="book_html">
<meta name="LASTUPDATED" content="12/04/03 16:06:26">
<title>13.1.3 Structures and unions </title>
<STYLE TYPE="text/css">
<!--
span.Signal { text-transform: uppercase; font-family: Verdana }
-->
</STYLE>
</head>
<body link="#3366CC" vlink="#9999CC" text="#000000" alink="#0000CC" bgcolor="#FFFFFF"
background="images/backgrnd.gif">
<p><img src="images/stlogo.gif" width="106" height="83" align="left"
alt="logo here!"> </p>
<table width="331" border="0" align="right" cellpadding="0" cellspacing="0">
<tr>
<td><a href="a_refman.htm"><img src="images/navtoc.gif" width="84" height="23"
border="0" alt="TOC"> </a></td>
<td><a href="impdet4.htm"><img src="images/navprev.gif" width="80" height="23"
border="0" alt="PREV"> </a></td>
<td><a href="impdet6.htm"><img src="images/navnext.gif" width="83" height="23"
border="0" alt="NEXT"> </a></td>
<td><a href="a_refmaa.htm"><img src="images/navidx.gif" width="84" height="23"
border="0" alt="INDEX"> </a></td>
</tr>
</table>
<p><br clear="all">
</p>
<hr align="left">
<blockquote>
<h3>
<a name="1204593"> </a><font color="#003366" face="Verdana, Arial, Helvetica, sans-serif">13.1.3 Structures and unions</font>
</h3>
<p>
<a name="1204594"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif">Layout of structures is very much dependent upon the particular compiler and the architecture of the target processor. The rules described here are very specific to the STMicroelectronics ISO (ANSI) C compiler, used by <strong>st20cc</strong> and the ST20 family of processors; they should not be treated as general rules for laying out structures.</font>
</p>
<p>
<a name="1204595"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif">Each field of a union is represented as it would be if it was not in a union.</font>
</p>
<p>
<a name="1204596"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif">The compiler uses the following rules when laying out the fields within a structure.</font>
</p>
<ul>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204597"> </a>C requires that structure fields are laid out in memory in the same order that they are in the source code.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204598"> </a>chars (represented in one byte) may have any alignment.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204599"> </a>shorts (represented in two bytes) are aligned on an even boundary.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204600"> </a>Adjacent bit-fields are packed into the same word if possible: the first bit-field is placed in the least significant bits of the word. If there is not enough room left after a previous bit-field, a bit-field is placed in the least significant bits of the next word.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204601"> </a>Word-sized or larger objects are aligned on a word boundary.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204602"> </a>Structures and unions are aligned on a word boundary.</font></p>
<p> <font size=2 face="Verdana, Arial, Helvetica, sans-serif"><li ><a name="1204603"> </a>Arrays are aligned in accordance with the alignment rules of the elements of the array.</font></p>
</ul>
<p>
<a name="1204604"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif"><font size=2 face=Courier><strong>char</strong></font> and <font size=2 face=Courier><strong>short</strong></font> fields are packed into the same word, where possible without breaking any of the above rules.</font>
</p>
<h5>
<a name="1210547"> </a><i><font color="#003366" face="Verdana, Arial, Helvetica, sans-serif">Example 1 (default layout)
<br><br>
<table border="0" cellpadding="5" cellspacing="0">
<caption><b><i><font face="Verdana, Arial, Helvetica, sans-serif"></font></i></b></caption>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210550"> </a><div ><font size=2><font size=2 face=Courier><strong>struct燿爗</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210552"> </a><div ><font size=2><br></font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210554"> </a><div ><font size=2><font size=2 face=Courier><strong>char爃id[8];</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210556"> </a><div ><font size=2>The first byte of <font size=2 face=Courier><strong>hid</strong></font> is on a word boundary (as the first byte of structure is on a word boundary); it occupies 8燽ytes (2 whole words). </font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210558"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爏hort爄nuse;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210560"> </a><div ><font size=2>This occupies the lower two bytes of the following word.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210562"> </a><div ><font size=2><font size=2 face=Courier><strong>char爁lags1;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210564"> </a><div ><font size=2>This is packed into byte 2 of the same word as <font size=2 face=Courier><strong>inuse</strong></font>.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210566"> </a><div ><font size=2><font size=2 face=Courier><strong>char爁lags2;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210568"> </a><div ><font size=2>This is packed into the upper byte of the same word as <font size=2 face=Courier><strong>inuse</strong></font> and <font size=2 face=Courier><strong>flags1</strong></font>.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210570"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爈ong爐key;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210572"> </a><div ><font size=2>This occupies the following word.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210574"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爏hort爐fil;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210576"> </a><div ><font size=2>This occupies the lower two bytes of the following word.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210578"> </a><div ><font size=2><font size=2 face=Courier><strong>long爊pos;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210580"> </a><div ><font size=2>This has to be allocated on the next word boundary, so two bytes are left unused.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210582"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爏hort爇mod;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210584"> </a><div ><font size=2>This occupies the lower two bytes of the following word.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210586"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爏hort爇bhz;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210588"> </a><div ><font size=2>This is packed into the upper two bytes of the same word as <font size=2 face=Courier><strong>kmod</strong></font>; 16-bit objects are placed at even addresses (rule 2), not word-addresses.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210590"> </a><div ><font size=2><font size=2 face=Courier><strong>unsigned爏hort爎mod;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210592"> </a><div ><font size=2>This occupies the lower two bytes of the following word.</font></div></font></td>
</tr>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210594"> </a><div ><font size=2><font size=2 face=Courier><strong>}爏tructure;</strong></font></font></div></font></td>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210596"> </a><div ><font size=2>Two bytes are left unused.</font></div></font></td>
</tr>
</table>
</font></i>
</h5>
<p>
<a name="1210768"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif">This can be represented diagramatically as follows:
<br><br>
<table border="1" cellpadding="5" cellspacing="0">
<caption><b><i><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210767"> </a><font face="Helvetica">Figure 28: Scalar types structures and unions - example 1</font></font></i></b></caption>
<tr>
<td><font face="Verdana, Arial, Helvetica, sans-serif"><a name="1210765"> </a><div ><font size=2><img src="images/impdeta.gif" height="226" width="528">
</font></div></font></td>
</tr>
</table>
</font>
</p>
<h5>
<a name="1204831"> </a><i><font color="#003366" face="Verdana, Arial, Helvetica, sans-serif">Example 2 (default layout)</font></i>
</h5>
<p>
<a name="1204832"> </a><font size=2 face="Verdana, Arial, Helvetica, sans-serif">If the structure fields are reordered, by moving <font size=2 face=Courier><strong>tfil</strong></font> so that it is no longer word aligned, then a more efficient packing could be obtained:</font>
</p>
<a name="1204833"> </a><font size=2 face=Courier><strong>struct d {<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -