2013-03-17 2 views
1
_declspec(align(32)) struct St{ 
    int foo; 
}; 
typedef std::aligned_storage<sizeof(St), std::alignment_of<St>::value>::type Ta; 

int main() { 
    std::cout << std::alignment_of<St>::value << '\n'; 
    std::cout << std::alignment_of<Ta>::value << '\n'; 
    return 0; 
} 

Выход:странное поведение станд :: aligned_storage

32 
8 

Я использую MSVC (Visual Studio 2012). Is Ta выровнено по 32, или всего 8?

+2

Не могли бы вы добавить тег visual-studio-20xx, который соответствует вашей версии компилятора, пожалуйста? – Mat

ответ

3

С VS2012 max_align_t 8, что означает, что максимальное выравнивание поддерживается во всех контекстах 8. Трассы больше этого значения «» расширенные выравнивания и

Это зависит от реализации, поддерживаются ли какие-либо расширенные выравнивания и контексты, в которых они поддерживаются.

[basic.align] 3,11/3

допускает выравнивание спецификатор расширенных выравниваний Microsoft, однако они не поддерживаются реализации стандартной библиотеки они используют. Хотя это не похоже на несоответствие, это похоже на проблему QoI.

2

Я перевел ваш пример в стандартный C++ 11, заменив struct alignas(32) St{ на _declspec(align(32)) struct St{.

Затем я запустил его на моей системе (лязг ++/LibC++) OS X. Мои результаты:

32 
32 

Если я изменяю 32 до 16 или 64 я по-прежнему получать такое же выравнивание для обоих St и Ta , Я подозреваю, что это ошибка в реализации, которую вы используете.

+0

Кажется, что alignas не поддерживается в сравнении. Спасибо, что указали это. – Frahm

Смежные вопросы