summaryrefslogtreecommitdiff
path: root/doc/html/align/examples.html
blob: 08d2ecf5e2c971052452486064994fd848a406da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Examples</title>
<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../align.html" title="Chapter&#160;3.&#160;Boost.Align">
<link rel="prev" href="rationale.html" title="Rationale">
<link rel="next" href="reference.html" title="Reference">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
<td align="center"><a href="../../../index.html">Home</a></td>
<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="rationale.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../align.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="align.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
</h2></div></div></div>
<h4>
<a name="align.examples.h0"></a>
      <span class="phrase"><a name="align.examples.aligned_allocation"></a></span><a class="link" href="examples.html#align.examples.aligned_allocation">Aligned
      allocation</a>
    </h4>
<p>
      To dynamically allocate storage with desired alignment, you can use the <code class="computeroutput"><span class="identifier">aligned_alloc</span></code> function:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span>
          <span class="identifier">storage</span> <span class="special">=</span>
          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_alloc</span><span class="special">(</span><span class="identifier">alignment</span><span class="special">,</span>
          <span class="identifier">size</span><span class="special">);</span></code>
        </li></ol></div>
<p>
      To deallocate storage allocated with the <code class="computeroutput"><span class="identifier">aligned_alloc</span></code>
      function, use the <code class="computeroutput"><span class="identifier">aligned_free</span></code>
      function:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_free</span><span class="special">(</span><span class="identifier">storage</span><span class="special">);</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h1"></a>
      <span class="phrase"><a name="align.examples.aligned_allocator"></a></span><a class="link" href="examples.html#align.examples.aligned_allocator">Aligned
      allocator</a>
    </h4>
<p>
      For C++ allocator aware code, you can use the <code class="computeroutput"><span class="identifier">aligned_allocator</span></code>
      class template for an allocator that respects over-alignment:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">int128_t</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_allocator</span><span class="special">&lt;</span><span class="identifier">int128_t</span><span class="special">&gt;</span>
          <span class="special">&gt;</span> <span class="identifier">vector</span><span class="special">;</span></code>
        </li></ol></div>
<p>
      This template allows specifying minimum alignment for all dynamic allocations:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_allocator</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="number">64</span><span class="special">&gt;</span> <span class="special">&gt;</span>
          <span class="identifier">vector</span><span class="special">;</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h2"></a>
      <span class="phrase"><a name="align.examples.aligned_allocator_adaptor"></a></span><a class="link" href="examples.html#align.examples.aligned_allocator_adaptor">Aligned
      allocator adaptor</a>
    </h4>
<p>
      To turn an allocator into an allocator that respects over-alignment, you can
      use the <code class="computeroutput"><span class="identifier">aligned_allocator_adaptor</span></code>
      class template:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_allocator_adaptor</span><span class="special">&lt;</span><span class="identifier">First</span><span class="special">&gt;</span> <span class="identifier">second</span><span class="special">(</span><span class="identifier">first</span><span class="special">);</span></code>
        </li></ol></div>
<p>
      This template allows specifying minimum alignment for all dynamic allocations:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_allocator_adaptor</span><span class="special">&lt;</span><span class="identifier">First</span><span class="special">,</span> <span class="number">64</span><span class="special">&gt;</span> <span class="identifier">second</span><span class="special">(</span><span class="identifier">first</span><span class="special">);</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h3"></a>
      <span class="phrase"><a name="align.examples.aligned_deleter"></a></span><a class="link" href="examples.html#align.examples.aligned_deleter">Aligned
      deleter</a>
    </h4>
<p>
      For a deleter that can be paired with <code class="computeroutput"><span class="identifier">aligned_alloc</span></code>,
      you can use the <code class="computeroutput"><span class="identifier">aligned_delete</span></code>
      class:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">unique_ptr</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">aligned_delete</span><span class="special">&gt;</span>
          <span class="identifier">pointer</span><span class="special">;</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h4"></a>
      <span class="phrase"><a name="align.examples.pointer_alignment"></a></span><a class="link" href="examples.html#align.examples.pointer_alignment">Pointer
      alignment</a>
    </h4>
<p>
      To advance a pointer to the next address with the desired alignment:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1">
<li class="listitem">
          <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span>
          <span class="identifier">pointer</span> <span class="special">=</span>
          <span class="identifier">storage</span><span class="special">;</span></code>
        </li>
<li class="listitem">
          <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">space</span>
          <span class="special">=</span> <span class="identifier">size</span><span class="special">;</span></code>
        </li>
<li class="listitem">
          <code class="computeroutput"><span class="keyword">void</span><span class="special">*</span>
          <span class="identifier">result</span> <span class="special">=</span>
          <span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">align</span><span class="special">(</span><span class="number">64</span><span class="special">,</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">double</span><span class="special">),</span> <span class="identifier">pointer</span><span class="special">,</span> <span class="identifier">space</span><span class="special">);</span></code>
        </li>
</ol></div>
<h4>
<a name="align.examples.h5"></a>
      <span class="phrase"><a name="align.examples.querying_alignment"></a></span><a class="link" href="examples.html#align.examples.querying_alignment">Querying
      alignment</a>
    </h4>
<p>
      To obtain the alignment of a given type at compie time, you can use:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">alignment_of</span><span class="special">&lt;</span><span class="identifier">int128_t</span><span class="special">&gt;::</span><span class="identifier">value</span></code>
        </li></ol></div>
<p>
      If your compiler supports C++14 variable templates, you can also use:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">alignment_of_v</span><span class="special">&lt;</span><span class="identifier">int128_t</span><span class="special">&gt;</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h6"></a>
      <span class="phrase"><a name="align.examples.hinting_alignment"></a></span><a class="link" href="examples.html#align.examples.hinting_alignment">Hinting
      alignment</a>
    </h4>
<p>
      To inform the compiler about the alignment of a pointer, you can use:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">BOOST_ALIGN_ASSUME_ALIGNED</span><span class="special">(</span><span class="identifier">pointer</span><span class="special">,</span> <span class="number">64</span><span class="special">)</span></code>
        </li></ol></div>
<h4>
<a name="align.examples.h7"></a>
      <span class="phrase"><a name="align.examples.checking_alignment"></a></span><a class="link" href="examples.html#align.examples.checking_alignment">Checking
      alignment</a>
    </h4>
<p>
      To check alignment of a pointer you can use the <code class="computeroutput"><span class="identifier">is_aligned</span></code>
      function:
    </p>
<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
          <code class="computeroutput"><span class="identifier">assert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">alignment</span><span class="special">::</span><span class="identifier">is_aligned</span><span class="special">(</span><span class="identifier">pointer</span><span class="special">,</span> <span class="number">64</span><span class="special">));</span></code>
        </li></ol></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014-2017 Glen
      Joseph Fernandes<p>
        Distributed under the Boost Software License, Version 1.0.
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="rationale.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../align.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>