[type_traits] type_with_alignment<64> on gcc
Hi, Is there any particular reason that type_with_alignment does not support alignment more than 32 on gcc? I am trying to create an unordered_map of objects that are aligned to cache line size (64bytes) and it fails in type_with_alignment. This small example shows it: #include <boost/tr1/unordered_map.hpp> struct __attribute__((aligned(64)) A { int i; }; int main() { std::tr1::unordered_map<int, A> umap; umap[0] = A(); return 0; } In file included from /usr/local/boost/boost_1.48/include/boost/aligned_storage.hpp:21:0, from /usr/local/boost/boost_1.48/include/boost/type_traits/aligned_storage.hpp:11, from /usr/local/boost/boost_1.48/include/boost/unordered/detail/buckets.hpp:17, from /usr/local/boost/boost_1.48/include/boost/unordered/detail/table.hpp:10, from /usr/local/boost/boost_1.48/include/boost/unordered/detail/equivalent.hpp:14, from /usr/local/boost/boost_1.48/include/boost/unordered/unordered_map.hpp:18, from /usr/local/boost/boost_1.48/include/boost/unordered_map.hpp:16, from /usr/local/boost/boost_1.48/include/boost/tr1/unordered_map.hpp:21, from test.cc:1: /usr/local/boost/boost_1.48/include/boost/type_traits/type_with_alignment.hpp: In instantiation of ‘boost::detail::type_with_alignment_imp<64ul>’: /usr/local/boost/boost_1.48/include/boost/type_traits/type_with_alignment.hpp:216:7: instantiated from ‘boost::type_with_alignment<64ul>’ /usr/local/boost/boost_1.48/include/boost/mpl/eval_if.hpp:60:31: instantiated from ‘boost::mpl::eval_if_c<false, boost::mpl::identity<boost::detail::max_align>, boost::type_with_alignment<64ul> >’ /usr/local/boost/boost_1.48/include/boost/aligned_storage.hpp:55:21: instantiated from ‘boost::detail::aligned_storage::aligned_storage_imp<128ul, 64ul>::data_t’ /usr/local/boost/boost_1.48/include/boost/aligned_storage.hpp:56:7: instantiated from ‘boost::detail::aligned_storage::aligned_storage_imp<128ul, 64ul>’ /usr/local/boost/boost_1.48/include/boost/aligned_storage.hpp:73:7: instantiated from ‘boost::aligned_storage<128ul, 64ul>’ /usr/local/boost/boost_1.48/include/boost/unordered/detail/table.hpp:281:59: instantiated from ‘boost::unordered::detail::value_base<std::pair<const int, A> >’ /usr/local/boost/boost_1.48/include/boost/unordered/detail/unique.hpp:47:12: instantiated from ‘boost::unordered::detail::ptr_node<std::pair<const int, A> >’ /usr/local/boost/boost_1.48/include/boost/unordered/detail/unique.hpp:332:40: instantiated from ‘boost::unordered::detail::table_impl<Types>::value_type& boost::unordered::detail::table_impl<Types>::operator[](const key_type&) [with Types = boost::unordered::detail::map<std::allocator<std::pair<const int, A> >, int, boost::hash<int>, std::equal_to<int> >, boost::unordered::detail::table_impl<Types>::value_type = std::pair<const int, A>, boost::unordered::detail::table_impl<Types>::key_type = int]’ /usr/local/boost/boost_1.48/include/boost/unordered/unordered_map.hpp:1007:26: instantiated from ‘boost::unordered::unordered_map<K, T, H, P, A>::mapped_type& boost::unordered::unordered_map<K, T, H, P, A>::operator[](const key_type&) [with K = int, T = A, H = boost::hash<int>, P = std::equal_to<int>, A = std::allocator<std::pair<const int, A> >, boost::unordered::unordered_map<K, T, H, P, A>::mapped_type = A, boost::unordered::unordered_map<K, T, H, P, A>::key_type = int]’ test.cc:11:9: instantiated from here /usr/local/boost/boost_1.48/include/boost/type_traits/type_with_alignment.hpp:206:1: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ /usr/local/boost/boost_1.48/include/boost/type_traits/type_with_alignment.hpp:207:1: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’ Is there any easy way to avoid this problem? Thanks
Is there any particular reason that type_with_alignment does not support alignment more than 32 on gcc?
None except there has to be a limit somewhere. The patch below enables up to 128-byte alignment, which matches what we do with MSVC. The patch should be in Trunk shortly as well. HTH, John. Index: type_with_alignment.hpp =================================================================== --- type_with_alignment.hpp (revision 76120) +++ type_with_alignment.hpp (working copy) @@ -225,6 +225,8 @@ struct __attribute__((__aligned__(8))) a8 {}; struct __attribute__((__aligned__(16))) a16 {}; struct __attribute__((__aligned__(32))) a32 {}; +struct __attribute__((__aligned__(64))) a64 {}; +struct __attribute__((__aligned__(128))) a128 {}; } template<> class type_with_alignment<1> { public: typedef char type; }; @@ -233,6 +235,8 @@ template<> class type_with_alignment<8> { public: typedef align::a8 type; }; template<> class type_with_alignment<16> { public: typedef align::a16 type; }; template<> class type_with_alignment<32> { public: typedef align::a32 type; }; +template<> class type_with_alignment<64> { public: typedef align::a64 type; }; +template<> class type_with_alignment<128> { public: typedef align::a128 type; }; namespace detail { BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a2,true) @@ -240,6 +244,8 @@ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a8,true) BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a16,true) BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a32,true) +BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a64,true) +BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::align::a128,true) } #endif #if (defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && _MSC_VER >= 1300
On 01/04/2012 06:51 AM, John Maddock wrote:
Is there any particular reason that type_with_alignment does not support alignment more than 32 on gcc?
None except there has to be a limit somewhere. The patch below enables up to 128-byte alignment, which matches what we do with MSVC. The patch should be in Trunk shortly as well.
HTH, John.
Thanks, tried it and works fine!
participants (2)
-
Ioannis Papadopoulos
-
John Maddock