Files
hustoj/web/cppreference-zh/chmhelp/cpp-language-ebo.html
2025-08-01 12:57:54 +08:00

179 lines
14 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>&#31354;&#22522;&#31867;&#20248;&#21270;</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-cpp_language_ebo skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">&#31354;&#22522;&#31867;&#20248;&#21270;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p>&#20801;&#35768;&#31354;&#30340;&#22522;&#31867;&#23376;&#23545;&#35937;&#22823;&#23567;&#20026;&#38646;&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>&#20026;&#20445;&#35777;&#21516;&#19968;&#31867;&#22411;&#30340;&#19981;&#21516;&#23545;&#35937;&#22320;&#22336;&#22987;&#32456;&#26377;&#21035;&#65292;&#35201;&#27714;&#20219;&#20309;<a href="cpp-language-object.html">&#23545;&#35937;</a>&#25110;&#25104;&#21592;&#23376;&#23545;&#35937;&#30340;&#22823;&#23567;&#33267;&#23569;&#20026; 1&#65292;&#21363;&#20351;&#35813;&#31867;&#22411;&#26159;&#31354;&#30340;<a href="cpp-language-class.html">&#31867;&#31867;&#22411;</a>&#65288;&#21363;&#27809;&#26377;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#30340; class &#25110; struct&#65289;<span class="t-rev-inl t-since-cxx20"><span>&#65288;&#65292;&#38500;&#38750;&#24102;&#26377; <code>[[<a href="cpp-language-attributes-no_unique_address.html">no_unique_address</a>]]</code>&#65292;&#35265;&#19979;&#25991;&#65289;</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#12290;</p>
<p>&#28982;&#32780;&#65292;&#22522;&#31867;&#23376;&#23545;&#35937;&#19981;&#21463;&#36825;&#31181;&#21046;&#32422;&#65292;&#32780;&#19988;&#21487;&#20197;&#23436;&#20840;&#20174;&#23545;&#35937;&#24067;&#23616;&#20013;&#34987;&#20248;&#21270;&#25481;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;cassert&gt;</span>
<span class="kw1">struct</span> Base <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31354;&#31867;</span>
<span class="kw1">struct</span> Derived1 <span class="sy4">:</span> Base <span class="br0">{</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="co1">// &#20219;&#20309;&#31354;&#31867;&#31867;&#22411;&#30340;&#23545;&#35937;&#22823;&#23567;&#33267;&#23569;&#20026; 1</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>Base<span class="br0">)</span> <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#24212;&#29992;&#31354;&#22522;&#31867;&#20248;&#21270;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>Derived1<span class="br0">)</span> <span class="sy1">==</span> sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#22914;&#26524;&#39318;&#20010;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#30340;&#31867;&#22411;&#19982;&#19968;&#20010;&#31354;&#22522;&#31867;&#30340;&#31867;&#22411;&#30456;&#21516;&#25110;&#32773;&#30001;&#35813;&#31354;&#22522;&#31867;&#27966;&#29983;&#65292;&#37027;&#20040;&#31105;&#29992;&#31354;&#22522;&#31867;&#20248;&#21270;&#65292;&#22240;&#20026;&#35201;&#27714;&#20004;&#20010;&#21516;&#31867;&#22411;&#22522;&#31867;&#23376;&#23545;&#35937;&#22312;&#26368;&#32456;&#27966;&#29983;&#31867;&#22411;&#30340;&#23545;&#35937;&#34920;&#31034;&#20013;&#24517;&#39035;&#25317;&#26377;&#19981;&#21516;&#22320;&#22336;&#12290;</p>
<p>&#36825;&#31181;&#24773;&#20917;&#30340;&#20856;&#20363;&#26159; <span class="t-lc"><a href="cpp-iterator-reverse_iterator.html">std::reverse_iterator</a></span> &#30340;&#26420;&#32032;&#23454;&#29616;&#65288;&#27966;&#29983;&#33258;&#31354;&#22522;&#31867; <span class="t-lc"><a href="cpp-iterator-iterator.html">std::iterator</a></span>&#65289;&#65292;&#23427;&#25345;&#26377;&#20854;&#24213;&#23618;&#36845;&#20195;&#22120;&#65288;&#21516;&#26679;&#27966;&#29983;&#33258; <span class="t-lc"><a href="cpp-iterator-iterator.html">std::iterator</a></span>&#65289;&#20026;&#20854;&#39318;&#20010;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;cassert&gt;</span>
<span class="kw1">struct</span> Base <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31354;&#31867;</span>
<span class="kw1">struct</span> Derived1 <span class="sy4">:</span> Base <span class="br0">{</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> Derived2 <span class="sy4">:</span> Base <span class="br0">{</span>
Base c<span class="sy4">;</span> <span class="co1">// Base&#65292;&#21344;&#29992; 1 &#23383;&#33410;&#65292;&#21518;&#38543;&#23545; i &#30340;&#22635;&#20805;</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> Derived3 <span class="sy4">:</span> Base <span class="br0">{</span>
Derived1 c<span class="sy4">;</span> <span class="co1">// &#20174; Base &#27966;&#29983;&#65292;&#21344;&#29992; sizeof(int) &#23383;&#33410;</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="co1">// &#19981;&#24212;&#29992;&#31354;&#22522;&#20248;&#21270;&#65292;</span>
<span class="co1">// &#22522;&#31867;&#21344;&#29992; 1 &#23383;&#33410;&#65292;Base &#25104;&#21592;&#21344;&#29992; 1 &#23383;&#33410;</span>
<span class="co1">// &#21518;&#38543; 2 &#20010;&#22635;&#20805;&#23383;&#33410;&#20197;&#28385;&#36275; int &#30340;&#23545;&#40784;&#35201;&#27714;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>Derived2<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">2</span><span class="sy2">*</span>sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#19981;&#24212;&#29992;&#31354;&#22522;&#31867;&#20248;&#21270;&#65292;</span>
<span class="co1">// &#22522;&#31867;&#21344;&#29992;&#33267;&#23569; 1 &#23383;&#33410;&#21152;&#22635;&#20805;&#65292;</span>
<span class="co1">// &#20197;&#28385;&#36275;&#39318;&#20010;&#25104;&#21592;&#30340;&#23545;&#40784;&#35201;&#27714;&#65288;&#20854;&#23545;&#40784;&#35201;&#27714;&#19982; int &#30456;&#21516;&#65289;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>Derived3<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">3</span><span class="sy2">*</span>sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p><a href="cpp-named_req-StandardLayoutType.html"><span style="font-style:italic">&#26631;&#20934;&#24067;&#23616;&#31867;&#22411;</span> <span style="font-family: Georgia, &#39;DejaVu Serif&#39;, serif; font-style:italic">(StandardLayoutType)</span></a> <i>&#24517;&#39035;</i>&#24212;&#29992;&#31354;&#22522;&#31867;&#20248;&#21270;&#20197;&#32500;&#25345;&#25351;&#21521;&#26631;&#20934;&#24067;&#23616;&#23545;&#35937;&#30340;&#25351;&#38024;&#22312;&#29992; <a href="cpp-language-reinterpret_cast.html">reinterpret_cast</a> &#36716;&#25442;&#21518;&#36824;&#25351;&#21521;&#20854;&#39318;&#25104;&#21592;&#65292;&#36825;&#26159;&#26631;&#20934;&#35201;&#27714;&#26631;&#20934;&#24067;&#23616;&#31867;&#22411;&ldquo;&#22312;&#21516;&#19968;&#20010;&#31867;&#20013;&#22768;&#26126;&#25152;&#26377;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#65288;&#20840;&#22312;&#27966;&#29983;&#31867;&#25110;&#20840;&#22312;&#26576;&#20010;&#22522;&#31867;&#65289;&rdquo;&#65292;&#24182;&#19988;&ldquo;&#19981;&#33021;&#26377;&#19982;&#39318;&#20010;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#31867;&#22411;&#30456;&#21516;&#30340;&#22522;&#31867;&rdquo;&#30340;&#21407;&#22240;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<p>&#22914;&#26524;&#31354;&#25104;&#21592;&#23376;&#23545;&#35937;&#20351;&#29992;&#23646;&#24615; <code>[[<a href="cpp-language-attributes-no_unique_address.html">no_unique_address</a>]]</code>&#65292;&#37027;&#20040;&#20801;&#35768;&#20687;&#31354;&#22522;&#31867;&#19968;&#26679;&#20248;&#21270;&#25481;&#23427;&#20204;&#12290;&#21462;&#36825;&#31181;&#25104;&#21592;&#30340;&#22320;&#22336;&#20250;&#20135;&#29983;&#21487;&#33021;&#31561;&#20110;&#21516;&#19968;&#20010;&#23545;&#35937;&#30340;&#26576;&#20010;&#20854;&#20182;&#25104;&#21592;&#30340;&#22320;&#22336;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;cassert&gt;</span>
<span class="kw1">struct</span> Empty <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#31354;&#31867;</span>
<span class="kw1">struct</span> X <span class="br0">{</span>
<span class="kw4">int</span> i<span class="sy4">;</span>
<span class="br0">[</span><span class="br0">[</span>no_unique_address<span class="br0">]</span><span class="br0">]</span> Empty e<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="co1">// &#20219;&#20309;&#31354;&#31867;&#31867;&#22411;&#23545;&#35937;&#30340;&#22823;&#23567;&#33267;&#23569;&#20026; 1</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>Empty<span class="br0">)</span> <span class="sy1">&gt;=</span> <span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// &#31354;&#25104;&#21592;&#34987;&#20248;&#21270;&#25481;</span>
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>sizeof<span class="br0">(</span>X<span class="br0">)</span> <span class="sy1">==</span> sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">&#27880;&#35299;</span></h3>
<p>&#31354;&#22522;&#31867;&#20248;&#21270;&#24120;&#29992;&#20110;&#20855;&#20998;&#37197;&#22120;&#30340;&#26631;&#20934;&#24211;&#31867;&#65288;<span class="t-lc"><a href="cpp-container-vector.html">std::vector</a></span>&#12289;<span class="t-lc"><a href="cpp-utility-functional-function.html">std::function</a></span>&#12289;<span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> &#31561;&#65289;&#65292;&#20351;&#24471;&#24403;&#20998;&#37197;&#22120;&#26080;&#29366;&#24577;&#26102;&#21487;&#36991;&#20813;&#20026;&#20854;&#20998;&#37197;&#22120;&#25104;&#21592;&#21344;&#29992;&#20219;&#20309;&#39069;&#22806;&#23384;&#20648;&#12290;&#36825;&#26159;&#36890;&#36807;&#23558;&#24517;&#35201;&#30340;&#25968;&#25454;&#25104;&#21592;&#20043;&#19968;&#65288;&#20363;&#22914; vector &#30340; begin&#12289;end &#25110; capacity &#25351;&#38024;&#65289;&#19982;&#20998;&#37197;&#22120;&#19968;&#36215;&#65292;&#22312; <a rel="nofollow" class="external text" href="http://www.boost.org/doc/libs/release/libs/utility/compressed_pair.htm">boost::compressed_pair</a> &#30340;&#26576;&#31181;&#31561;&#20215;&#29289;&#20013;&#23384;&#20648;&#32780;&#23454;&#29616;&#30340;&#12290;</p>
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">&#24341;&#29992;</span></h3>
<div class="t-ref-std-c++11">
<ul>
<li>C++11 &#26631;&#20934;&#65288;ISO/IEC 14882:2011&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>5.10 Equality operators [expr.eq](p: 2)</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>5.3.3 Sizeof [expr.sizeof](p: 2)</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>9 Classes [class](p: 4,7)</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>9.2 Class members [class.mem](p: 20)</li>
</ul>
</dd>
</dl>
</div>
<div class="t-ref-std-c++98">
<ul>
<li>C++98 &#26631;&#20934;&#65288;ISO/IEC 14882:1998&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>5.10 Equality operators [expr.eq](p: 2)</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>5.3.3 Sizeof [expr.sizeof](p: 2)</li>
</ul>
</dd>
</dl>
<dl>
<dd>
<ul>
<li>9 Classes [class](p: 3)</li>
</ul>
</dd>
</dl>
</div>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>