2013-03-17 81 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; 
} 

輸出是:奇怪的std ::行爲aligned_storage

32 
8 

我使用MSVC(的Visual Studio 2012)。是Ta排列32,或只是8?

+2

您可以添加對應於您的編譯器版本的visual-studio-20xx標籤嗎? – Mat 2013-03-17 09:42:24

回答

3

隨着VS2012 max_align_t是8,這意味着在所有上下文中支持的最大取向是大於該值的8路線是「擴展比對」和

它是實現定義的任何擴展比對是否支持以及它們所支持的背景。

[basic.align 3.11/3

微軟的對齊方式說明允許延長路線,但它們不會被他們所使用的標準庫的實現支持。雖然這看起來不是不符合的,但它對我來說似乎是一個QoI問題。

2

我把你的例子翻譯成標準的C++ 11,用struct alignas(32) St{代替_declspec(align(32)) struct St{

然後我跑了我的系統(鐺++ /的libC++)OS X.在我的結果是:

32 
32 

如果我改變32至16或64我繼續得到兩個StTa相同的對齊。我懷疑這是你正在使用的實現中的一個錯誤。

+0

似乎在vs中不支持alignas。謝謝您指出。 – Frahm 2013-03-18 01:25:42