2013-11-15 48 views
3

下面的代碼(MSVC 2012年,32位):alignof(雙)在MSVC的win32

#include <iostream> 

int main() 
{ 
    double d; 
    std::cout<<_alignof(double)<<std::endl; 
    std::cout<<((size_t)(&d)) % _alignof(double)<<std::endl; 
    return 0; 
} 

輸出是一段:

8 
0 

但是,有時它是:

8 
4 

alignof(double)= 8是否意味着double的對齊將是8?

Iv'e看出: http://msdn.microsoft.com/en-us/library/aa290049(v=vs.71).aspx ,但我不知道我的理解是......

+0

您的文本顯示'alignof',但您的代碼顯示'_alignof'(並且鏈接的網站會討論另一個'__alignof'),我們在這裏談論哪些?我可以想象他們有微妙的差異。 – PlasmaHH

+0

文章告訴你,對於32位代碼,堆棧對齊爲4,並且編譯器會在必要時努力將其對齊到8。核心問題是你沒有給它足夠的理由去做這件事。你實際上必須*使用變量來使它對齊。當你在生成的代碼中看到'和esp,0FFFFFFF8h'時,你就會知道你在前面。 –

+0

我試過使用這個變量。它仍然不是8字節對齊的。 – eranb

回答

0

那是因爲你把堆棧地址(& d),其起始地址是動態計算的,當你的程序開始。 _alignof(double)將始終返回8,因爲對於基本類型,它與它們的大小相同。

+2

他的問題可能是爲什麼堆棧中的變量沒有按照他認爲應該的方式對齊。 – PlasmaHH

+2

這意味着'_alignof'產生的東西除了實際需要的對齊類型之外。 –

+0

那麼,規範(C++ 11)說關於對齊 - 「......對該類型的對象可能被分配的地址的限制」。它只涉及動態分配嗎? – eranb