181 lines
11 KiB
HTML
181 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>_Alignas</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_Alignas skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">_Alignas</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>出现于<a href="c-language-declarations.html">声明</a>语法中,作为修改声明对象<a href="c-language-object.html#.E5.AF.B9.E9.BD.90">对齐要求</a>的说明符。</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>_Alignas</b></code> <code><b>(</b></code> <span class="t-spar">表达式</span> <code><b>)</b></code></td>
|
|
<td>(1)</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>_Alignas</b></code> <code><b>(</b></code> <span class="t-spar">类型</span> <code><b>)</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">表达式</span></td>
|
|
<td>-</td>
|
|
<td>任何值为合法<a href="c-language-object.html#.E5.AF.B9.E9.BD.90">对齐</a>或零的<a href="c-language-constant_expression.html">整数常量表达式</a></td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">类型</span></td>
|
|
<td>-</td>
|
|
<td>任何<a href="c-language-types.html#.E7.B1.BB.E5.9E.8B.E5.90.8D">类型名称</a></td>
|
|
</tr>
|
|
</table>
|
|
<p>此关键词亦用作便利宏 <a href="c-types.html"><tt>alignas</tt></a> ,此宏可用于头文件 <code><stdalign.h></code> 。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p><code>_Alignas</code> 只能在声明不是<a href="c-language-bit_field.html">位域</a>,且不拥有<a href="c-language-storage_duration.html">寄存器</a>存储类的对象时使用。它不能用于函数参数声明,亦不能用于 typedef 。</p>
|
|
<p>用于声明时,设置被声明对象的<a href="c-language-object.html#.E5.AF.B9.E9.BD.90">对齐要求</a>为</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> <span class="t-spar">表达式</span> 的结果,除非它是零</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> <span class="t-spar">类型</span> 的对齐要求,即设置为 <span class="t-c"><span class="mw-geshi c source-c">_Alignof<span class="br0">(</span>type<span class="br0">)</span></span></span></div>
|
|
<p>除非这会减弱该类型自然拥有的对齐。</p>
|
|
<p>若 <span class="t-spar">表达式</span> 求值为零,则此指定符无效果。</p>
|
|
<p>多个 <code>_Alignas</code> 说明符出现于同一个声明中时,使用最严格者。</p>
|
|
<p><code>_Alignas</code> 说明符只需要出现于对象<a href="c-language-declarations.html#.E5.AE.9A.E4.B9.89">定义</a>中,但若任何声明使用 <code>_Alignas</code> ,则它所说明的对齐必须与定义上的 <code>_Alignas</code> 相同。若不同的翻译单元为同一对象说明不同对齐,则行为未定义。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>C++ 中, <code>alignas</code> 说明符亦可应用于声明 <code>class</code>/<code>struct</code>/<code>union</code> 类型以及枚举。这在 C 中不受支持,但能通过在成员声明中使用 <code>_Alignas</code> 控制 struct 类型的对齐。</p>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="c-keyword-_Alignas.html"><tt>_Alignas</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdalign.h></span>
|
|
<span class="co2">#include <stdio.h></span>
|
|
<span class="co1">// 每一个 struct sse_t 类型的对象会在 16 字节边界对齐</span>
|
|
<span class="co1">// (注意:需要支持 DR 444 )</span>
|
|
<span class="kw1">struct</span> sse_t
|
|
<span class="br0">{</span>
|
|
alignas<span class="br0">(</span><span class="nu0">16</span><span class="br0">)</span> <span class="kw4">float</span> sse_data<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 这种 struct data 的每一个对象都会在 128 字节边界对齐</span>
|
|
<span class="kw1">struct</span> data <span class="br0">{</span>
|
|
<span class="kw4">char</span> x<span class="sy4">;</span>
|
|
alignas<span class="br0">(</span><span class="nu0">128</span><span class="br0">)</span> <span class="kw4">char</span> cacheline<span class="br0">[</span><span class="nu0">128</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// 过对齐的 char 数组对象,</span>
|
|
<span class="co1">// 不是过对齐的 char 对象的数组</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)<span class="es1">\n</span>"</span>,
|
|
<span class="kw4">sizeof</span><span class="br0">(</span><span class="kw1">struct</span> data<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"alignment of sse_t is %zu<span class="es1">\n</span>"</span>, alignof<span class="br0">(</span><span class="kw1">struct</span> sse_t<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
alignas<span class="br0">(</span><span class="nu0">2048</span><span class="br0">)</span> <span class="kw1">struct</span> data d<span class="sy4">;</span> <span class="co1">// 此 struct data 的实例会更严格地对齐</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">sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
|
|
alignment of sse_t is 16</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2396.htm#dr_444">DR 444</a></td>
|
|
<td>C11</td>
|
|
<td>结构体与联合体成员中不允许 <code>_Alignas</code></td>
|
|
<td>允许</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-17">
|
|
<ul>
|
|
<li>C17 标准(ISO/IEC 9899:2018):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.5 Alignment specifier (p: 92)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.2.8 Alignment of objects (p: 36-37)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>7.15 Alignment <stdalign.h> (p: 196)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.5 Alignment specifier (p: 127-128)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.2.8 Alignment of objects (p: 48-49)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>7.15 Alignment <stdalign.h> (p: 268)</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 class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|