[/ Copyright 2007 John Maddock. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). ] [section:aligned_storage aligned_storage] template struct aligned_storage { typedef __below type; }; __type a built-in or POD type with size `Size` and an alignment that is a multiple of `Align`. __header ` #include ` or ` #include ` On the GCC and Visual C++ compilers (or compilers that are compatible with them), we support requests for types with alignments greater than any built in type (up to 128-bit alignment). Visual C++ users should note that such "extended" types can not be passed down the stack as by-value function arguments. [important Visual C++ users should be aware that MSVC has an elastic definition of alignment, for example consider the following code: `` typedef boost::aligned_storage<8,8>::type align_t; assert(boost::alignment_of::value % 8 == 0); align_t a; assert(((std::uintptr_t)&a % 8) == 0); char c = 0; align_t a1; assert(((std::uintptr_t)&a1 % 8) == 0); `` In this code the final assert will fail for a 32-bit build because variable `a1` is not aligned on an 8-byte boundary. Had we used the MSVC intrinsic `__alignof` in place of `alignment_of` or `std::aligned_storage` in place of `boost::aligned_storage` the result would have been no different. In MSVC alignment requirements/promises only really apply to variables on the heap, not on the stack. Further, although MSVC has a mechanism for generating new types with arbitrary alignment requirements, such types cannot be passed as function arguments on the program stack. Therefore had `boost::aligned_storage<8,8>::type` been a type declared with `__declspec(align(8))` we would break a great deal of existing code that relies on being able to pass such types through the program stack. ] [endsect]