[/ 
  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:alignment_of alignment_of]
   template <class T>
   struct alignment_of : public __integral_constant<std::size_t, ALIGNOF(T)> {};
  
__inherit Class template `alignment_of` inherits from 
`__integral_constant<std::size_t, ALIGNOF(T)>`, where `ALIGNOF(T)` is the
alignment of type T.  

['Note: strictly speaking you should only rely on 
the value of `ALIGNOF(T)` being a multiple of the true alignment of T, although
in practice it does compute the correct value in all the cases we know about.]

__header ` #include <boost/type_traits/alignment_of.hpp>` or ` #include <boost/type_traits.hpp>`

__examples

[:`alignment_of<int>` inherits from `__integral_constant<std::size_t, ALIGNOF(int)>`.]

[:`alignment_of<char>::type` is the type `__integral_constant<std::size_t, ALIGNOF(char)>`.]

[:`alignment_of<double>::value` is an integral constant 
expression with value `ALIGNOF(double)`.]

[:`alignment_of<T>::value_type` is the type `std::size_t`.]

[important
Visual C++ users should note that MSVC has varying definitions of "alignment".
For example consider the following code:

``
   typedef long long align_t;
   assert(boost::alignment_of<align_t>::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, even though `boost::alignment_of<align_t>` reports that `align_t` has 8-byte
alignment, the final assert will fail for a 32-bit build because `a1` is not aligned on an
8 byte boundary.  Note that had we used the MSVC intrinsic `__alignof` in place of `boost::alignment_of`
we would still get the same result.  In fact for MSVC alignment requirements (and promises) only really 
apply to dynamic storage, and not the stack.
]

[endsect]

