The C++11 standard introduced alignment support as one of the many features of the C++ programming language that can be used with the latest C++ compilers today. One of the new features of this support was a new keyword align std::aligned_union
that is used to provide a nested type which can be used as an uninitialized storage for any object whose size is at most the object size stated by the alignment size requirement. In this post, we explain how we can use align
_union in Modern C++.
Table of Contents
What is alignment support in modern C++?
When we talk about ‘alignment’ in C++ it means a set of hints or instructions that tell the compiler to place the physical representation of data structures and variables in memory so that they line up at specific intervals of bytes – the underlaying digital representation of all data items. Alignment tells the compiler and linker to add additional ‘space’ to a value in memory so that the next object begins ‘nicely’ on a particular memory boundary.
Due to the way the CPU and other logic chips in a computer work, alignment can help create more computationally efficient programs. Think of it in the way you cut a cake – if you use an even number of slices for your cake it’s much easier and quicker to divide it up because you can cut the cake into nice even chunks of two. If you get an odd number of cake slices, it’s a lot harder to work out how big those slices need to be to make sure you don’t have a huge slice of cake left over – or someone gets a tiny slice (or none) and stays hungry! By cutting the cake in half each time you are ‘aligning’ your cake slices evenly and optimally so all cake is efficiently used with no wasted cake.
The C++11 standard intends to extend the standard language and library with alignment-related features, known as alignment support. These alignment features include:
- The alignment specifier
alignas
for declarations. - The
alignof
expression to retrieve alignment requirements of a type. - Alignment arithmetic by library support (
aligned_storage
,aligned_union
). - std::align standard function for pointer alignment at run time.
Alignment support in C++ can be found in more detail here in the C++ standards [Note: PDF link]. We also discuss the alignof
keyword in this blog post: https://learncplusplus.org/what-is-the-alignof-expression-in-modern-c/.
In this post, we will explain the aligned_union
statement.
What does aligned_union mean in modern C++?
The aligned_union
(std::aligned_union
) is used to provide a nested type which can be used as an uninitialized storage for an object of any types listed in types. In other words, std::aligned_union
provides a POD type large enough and suitably aligned to store a union type by the required align size. Here are the syntax and helper type for the align_union
:
Syntax (Since C++11, deprecated in C++23):
1 2 3 4 |
template< std::size_t object_size, class... Types> struct aligned_union; |
Helper type (Since C++14, deprecated in C++23):
1 2 3 4 |
template < std::size_t object_size, class... Types > using aligned_union_t = typename aligned_union<Len,Types...>::type; |
Note that aligned_union
and aligned_storage
are deprecated in C++23. There is also aligned_alloc
which was introduced with the C++17 standards.
Is there a simple example of how to use aligned_union in modern C++?
Here are some examples how you can use aligned_union in C++.
1 2 3 |
using myunion_t = std::aligned_union<32, int, float, std::string>; myunion_t aligned_storage; |
and here is an example how you can use with a union
:
1 2 3 4 5 6 7 8 9 10 |
union my_union { int i; float f; }; typedef std::aligned_union<32, int, float>::type my_aligned; my_aligned a; my_union* uni= new(&a) my_union; |
and here is the aligned_union_t
helper in use:
1 |
std::cout << sizeof(std::aligned_union_t<20, char, int, double>) << std::endl; |
Is there a full example of how to use aligned_union in modern C++?
Here is a full C++ example of how to use aligned_union
:
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 |
#include <iostream> #include <type_traits> union my_union { char c; int i; float f; double d; }; typedef std::aligned_union<32, char, int, float, double>::type my_aligned; using myunion_t = std::aligned_union<32, int, float, std::string>; int main() { myunion_t aligned_storage; my_aligned a; // allocate aligned memory my_union* uni= new(&a) my_union; // place union in aligned memory std::cout << sizeof(std::aligned_union_t<32, char, int, double>) << std::endl; return 0; } |
If you need more in-depth details about this feature, see the original Alignment Support Proposal document.
C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, MacOS, iOS & Android operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs.