128 lines
11 KiB
HTML
128 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>内存模型</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_memory_model skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">内存模型</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>为 C 抽象机的目的,定义计算机内存存储的语义。</p>
|
|
<p>可用于 C 程序的数据存储(内存)是一个或多个连续<i>字节</i>的序列。内存中每个字节拥有唯一的<i>地址</i>。</p>
|
|
<h3><span class="mw-headline" id=".E5.AD.97.E8.8A.82">字节</span></h3>
|
|
<p><i>字节</i>是内存的最小可寻址单元。它定义为一系列连续的位,足以保有任何<i>基础执行字符集</i>(要求 <a href="c-language-translation_phases.html">96 个字符</a>是单字节)。 C 支持大小为 8 位或更多的字节。</p>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span></span></span> 、 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">char</span></span></span> 及 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">signed</span> <span class="kw4">char</span></span></span> <a href="c-language-types.html">类型</a>的存储和<a href="c-language-object.html">值表示</a>都使用一个字节。字节的位数可以用 <span class="t-lc"><a href="c-types-limits.html">CHAR_BIT</a></span> 访问。</p>
|
|
<p>对于用字节表示其他基础类型的(包含大端与小端内存布局),见<a href="c-language-object.html#.E5.AF.B9.E8.B1.A1.E8.A1.A8.E7.A4.BA">对象表示</a>。</p>
|
|
<h3><span class="mw-headline" id=".E5.86.85.E5.AD.98.E4.BD.8D.E7.BD.AE">内存位置</span></h3>
|
|
<p><i>内存位置</i>是</p>
|
|
<ul>
|
|
<li>一个<a href="c-language-types.html#.E5.AF.B9.E8.B1.A1.E7.BB.84.E5.88.AB">标量类型</a>(算术类型、指针类型、枚举类型)的对象</li>
|
|
<li>或非零长<a href="c-language-bit_field.html">位域</a>的最大连续序列</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> S <span class="br0">{</span>
|
|
<span class="kw4">char</span> a<span class="sy4">;</span> <span class="co1">// 内存位置 #1</span>
|
|
<span class="kw4">int</span> b <span class="sy4">:</span> <span class="nu0">5</span><span class="sy4">;</span> <span class="co1">// 内存位置 #2</span>
|
|
<span class="kw4">int</span> c <span class="sy4">:</span> <span class="nu0">11</span>, <span class="co1">// 内存位置 #2 (连续)</span>
|
|
<span class="sy4">:</span> <span class="nu0">0</span>,
|
|
d <span class="sy4">:</span> <span class="nu0">8</span><span class="sy4">;</span> <span class="co1">// 内存位置 #3</span>
|
|
<span class="kw1">struct</span> <span class="br0">{</span>
|
|
<span class="kw4">int</span> ee <span class="sy4">:</span> <span class="nu0">8</span><span class="sy4">;</span> <span class="co1">// 内存位置 #4</span>
|
|
<span class="br0">}</span> e<span class="sy4">;</span>
|
|
<span class="br0">}</span> obj<span class="sy4">;</span> <span class="co1">// 对象“ obj ”由 4 个分离的内存位置组成</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<h3><span class="mw-headline" id=".E7.BA.BF.E7.A8.8B.E5.8F.8A.E6.95.B0.E6.8D.AE.E7.AB.9E.E4.BA.89">线程及数据竞争</span></h3>
|
|
<p>执行的线程是一个程序中的控制流,它以调用顶层函数 <span class="t-lc"><a href="c-thread-thrd_create.html">thrd_create</a></span> 或其他方法起始。</p>
|
|
<p>任意线程可潜在地访问程序中的任意对象(拥有自动及线程局域<a href="c-language-storage_duration.html">存储期</a>的对象仍能通过指针被另一线程访问)。</p>
|
|
<p>执行的不同线程始终允许同时访问(读或修改)不同的<i>内存位置</i>,这没有冲突和同步要求(注意同时更新二个同一结构体内的非原子位域是不安全的,若所有声明于其间的成员亦为(非零长)位域,不管那些插入的位域大小是多少)。</p>
|
|
<p>一个表达式的<a href="c-language-eval_order.html">求值</a>写入一个内存位置,而另一求值读取或修改同一内存位置时,我们称这两个表达式<i>冲突</i>。拥有两个冲突表达式的程序有<i>数据竞争</i>,除非</p>
|
|
<ul>
|
|
<li>两个冲突求值是<a href="c-language-atomic.html">原子操作</a></li>
|
|
<li>一个冲突求值<i>先发生于</i>另一个(见 <span class="t-lc"><a href="c-atomic-memory_order.html">memory_order</a></span> )</li>
|
|
</ul>
|
|
<p>若发生数据竞争,则程序行为未定义。</p>
|
|
<p>(特别是, <span class="t-lc"><a href="c-thread-mtx_unlock.html">mtx_unlock</a></span> 与另一线程的 <span class="t-lc"><a href="c-thread-mtx_lock.html">mtx_lock</a></span> <i>同步</i>,从而<i>先发生于</i>后者,这使得可以用互斥锁保证排除数据竞争)</p>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:一或二个小示例</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.86.85.E5.AD.98.E9.A1.BA.E5.BA.8F">内存顺序</span></h3>
|
|
<p>线程从一个内存位置读取值时,它可能看到初始值、被同一线程写入的值,或被其他线程写入的值。关于线程所做的写入对其他线程变得可见的顺序细节,见 <span class="t-lc"><a href="c-atomic-memory_order.html">memory_order</a></span> 。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.6 byte (p: 4)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.14 memory location (p: 5)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>5.1.2.4 Multi-threaded executions and data races (p: 17-21)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.6 byte (p: 4)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>1.6 DEFINITIONS OF TERMS</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|