146 lines
15 KiB
HTML
146 lines
15 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>sizeof 运算符</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_sizeof skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">sizeof 运算符</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <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>查询对象或类型的大小。</p>
|
|
<p>在需要知道对象的实际大小时使用。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>sizeof(</b></code> <span class="t-spar">类型</span> <code><b>)</b></code></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>sizeof</b></code> <span class="t-spar">表达式</span> <code></code></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>两个版本都是 <span class="t-lc"><a href="cpp-types-size_t.html">std::size_t</a></span> 类型的常量表达式。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<div class="t-li1"><span class="t-li">1)</span> 产生<span class="t-spar">类型</span> 的<a href="cpp-language-object.html">对象表示</a>的字节数。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 产生<span class="t-spar">表达式</span> 的类型的对象表示的字节数,假如该表达式被求值。</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>取决于计算机架构,<a href="https://en.wikipedia.org/wiki/Byte" class="extiw" title="enwiki:Byte">字节</a>可能具有8<i>或更多</i>位,精确的位数记录于 <span class="t-lc"><a href="cpp-types-climits.html">CHAR_BIT</a></span>。</p>
|
|
<p>下列 <code>sizeof</code> 表达式总是求值为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu0">1</span></span></span>:</p>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof<span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof<span class="br0">(</span><span class="kw4">signed</span> <span class="kw4">char</span><span class="br0">)</span></span></span></li>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof<span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span><span class="br0">)</span></span></span></li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof<span class="br0">(</span>std<span class="sy4">::</span><span class="me2">byte</span><span class="br0">)</span></span></span></li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof<span class="br0">(</span>char8_t<span class="br0">)</span></span></span></li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>不能对函数类型、不完整类型或位域泛左值使用 <code>sizeof</code>。</p>
|
|
<p>当应用于引用类型时,结果是被引用类型的大小。</p>
|
|
<p>当应用于类类型时,结果是该类的完整对象所占据的字节数,包括这种对象放入数组时所需的任何额外填充。<a href="cpp-language-object.html#.E5.AD.90.E5.AF.B9.E8.B1.A1">潜在重叠的子对象</a>所占据的字节数可以小于该对象的大小。</p>
|
|
<p><code>sizeof</code> 的结果始终非零,即使应用于空类。</p>
|
|
<p>当应用于某个表达式时,<code>sizeof</code> <a href="cpp-language-expressions.html#.E4.B8.8D.E6.B1.82.E5.80.BC.E8.A1.A8.E8.BE.BE.E5.BC.8F">并不对表达式进行求值</a>,并且即便表达式代表多态对象,其结果也是该表达式的静态类型的大小。不进行左值向右值、数组向指针和函数向指针转换。<span class="t-rev-inl t-since-cxx17"><span>不过,它在形式上对纯右值实参进行<a href="cpp-language-implicit_conversion.html#.E4.B8.B4.E6.97.B6.E9.87.8F.E5.AE.9E.E8.B4.A8.E5.8C.96">临时量实质化</a>:若实参不可析构则程序非良构。</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span></p>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-sizeof.html"><tt>sizeof</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>本示例的输出对应于具有 64 位指针和 32 位 int 的系统。</p>
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
|
|
<span class="kw1">struct</span> Empty <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> Base <span class="br0">{</span> <span class="kw4">int</span> a<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> Derived <span class="sy4">:</span> Base <span class="br0">{</span> <span class="kw4">int</span> b<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> Bit <span class="br0">{</span> <span class="kw4">unsigned</span> bit<span class="sy4">:</span> <span class="nu0">1</span><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>
|
|
Empty e<span class="sy4">;</span>
|
|
Derived d<span class="sy4">;</span>
|
|
Base<span class="sy3">&</span> b <span class="sy1">=</span> d<span class="sy4">;</span>
|
|
<span class="br0">[</span><span class="br0">[</span>maybe_unused<span class="br0">]</span><span class="br0">]</span> Bit bit<span class="sy4">;</span>
|
|
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"空类的大小: "</span> <span class="sy1"><<</span> sizeof e <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"指针的大小: "</span> <span class="sy1"><<</span> sizeof <span class="sy3">&</span>e <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="co1">// << "函数的大小: " << sizeof(void()) << "\n" // 错误</span>
|
|
<span class="co1">// << "不完整类型的大小: " << sizeof(int[]) << "\n" // 错误</span>
|
|
<span class="co1">// << "位域的大小: " << sizeof bit.bit << "\n" // 错误</span>
|
|
<span class="sy1"><<</span> <span class="st0">"Bit 类的大小: "</span> <span class="sy1"><<</span> sizeof<span class="br0">(</span>Bit<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"含有10个 int 的数组的大小: "</span> <span class="sy1"><<</span> sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"含有10个 int 的数组的大小 (2):"</span> <span class="sy1"><<</span> sizeof a <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"含有10个 int 的数组的长度: "</span> <span class="sy1"><<</span> <span class="br0">(</span><span class="br0">(</span>sizeof a<span class="br0">)</span> <span class="sy2">/</span> <span class="br0">(</span>sizeof <span class="sy2">*</span>a<span class="br0">)</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"含有10个 int 的数组的长度 (2):"</span> <span class="sy1"><<</span> <span class="br0">(</span><span class="br0">(</span>sizeof a<span class="br0">)</span> <span class="sy2">/</span> <span class="br0">(</span>sizeof a<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"Derived 的大小: "</span> <span class="sy1"><<</span> sizeof d <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">"通过 Base 获取 Derived 的大小:"</span> <span class="sy1"><<</span> sizeof b <span class="sy1"><<</span> <span class="st0">"<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">空类的大小: 1
|
|
指针的大小: 8
|
|
Bit 类的大小: 4
|
|
含有10个 int 的数组的大小: 40
|
|
含有10个 int 的数组的大小 (2):40
|
|
含有10个 int 的数组的长度: 10
|
|
含有10个 int 的数组的长度 (2):10
|
|
Derived 的大小: 8
|
|
通过 Base 获取 Derived 的大小:4</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td><a href="cpp-language-alignof.html"><code>alignof</code> 运算符</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>查询类型的对齐要求</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><a href="cpp-language-sizeof....html"><code>sizeof...</code> operator</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>查询<a href="cpp-language-parameter_pack.html">形参包</a>中的元素数</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|