From d0631eec745828207cf251232cef0d681cb758d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Tue, 16 Apr 2024 14:42:42 +0200 Subject: [PATCH] Implement aligned_struct with __declspec(align(x)) for x = 8 as MSVC will not align the stack if a built-in type is used (like double). --- include/boost/move/detail/type_traits.hpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/include/boost/move/detail/type_traits.hpp b/include/boost/move/detail/type_traits.hpp index 84dcbce..de8b2eb 100644 --- a/include/boost/move/detail/type_traits.hpp +++ b/include/boost/move/detail/type_traits.hpp @@ -1197,12 +1197,20 @@ struct aligned_struct; template <> struct aligned_struct<1> { char data; }; template <> struct aligned_struct<2> { short data; }; template <> struct aligned_struct<4> { int data; }; -template <> struct aligned_struct<8> { double data; }; +//8 byte alignment does not propely work in x86 if attribute is not used. +//If a user declares a variable with 8 byte alignment, such as a double +//the compiler will not realign the stack. +// +//If _declspec(align) is used MSVC will realign the stack. +// +//Disabled specialization +//template <> struct aligned_struct<8> { double data; }; #define BOOST_MOVE_ALIGNED_STRUCT(x) \ template <> struct aligned_struct { \ __declspec(align(x)) char data; \ } +BOOST_MOVE_ALIGNED_STRUCT(8); BOOST_MOVE_ALIGNED_STRUCT(16); BOOST_MOVE_ALIGNED_STRUCT(32); BOOST_MOVE_ALIGNED_STRUCT(64);