2012-11-27 63 views
-1

假設下面有非POD結構,對齊是否起作用?如果不是,會有什麼預期?針對非POD結構的對齊緩存

struct S1 
{ 
    string s; 
    int32_t i; 
    double d; 
} __attribute__ ((aligned (64))); 

編輯:下面的示例代碼的輸出是64甚至s設置爲一個長字符串。

int main(int argc,char *argv[]) 
{ 

     S1 s1; 

     s1.s = "123451111111111111111111111111111111111111111111111111111111111111111111111111"; 
     s1.i = 100; 
     s1.d = 20.123; 
     printf("%ld\n", sizeof(s1)); 
     return 1; 
} 
+0

你觀察到了什麼? – Sheena

+0

該職位更新 –

+0

'std :: string'將其內容存儲在堆上,至少在一般情況下,所以它的sizeof()'不受存儲的字符串長度影響。 – Angew

回答

0

是的,對齊在GCC中生效。

示例代碼:

#include <string> 
#include <iostream> 
#include <cstddef> 
using namespace std; 


struct S1 
{ 
    string s; 
    int i; 
    double d; 
} __attribute__ ((aligned (64))); 

struct S2 
{ 
    string s; 
    int i; 
    double d; 
} __attribute__ ((aligned)); // let the compiler decide 

struct S3 
{ 
    string s; 
    int i; 
    double d; 
}; 

int main() { 
    cout << "S1 " << sizeof(S1) << endl; 
    cout << "S2 " << sizeof(S2) << endl; 
    cout << "S3 " << sizeof(S3) << endl; 
} 

輸出:

S1 64 
S2 16 
S3 16 

另外:您已觀察到,S1是非POD。請注意,允許std::string在外部存儲其數據(通常這是因爲數據可以是任意長度,所以必須動態分配內存緩衝區)。

記住sizeof在編譯時只計算,它可以不依賴於運行時的值。具體而言,您無法以這種方式查詢動態分配內存的大小。

還記得數組中的每個元素總是與相同,因此也是相同的大小。

1

C++中的對象大小從未改變。它的編譯時間不變。它必須是,因爲編譯器需要知道爲對象分配多少空間。實際上,sizeof(s1)只是sizeof(S1)的別名,後面沒有涉及實例。

std::string是一個小對象,它包裝指向字符數組的指針並重新分配該數組以適應您設置的值。所以字符串本身被存儲在S1對象之外。

__attribute__ ((aligned (64)))不是標準的C++,它是GCC擴展。即使是非POD對象也很榮幸。它只是告訴編譯器將結構的大小舍入到64字節的下一個倍數。

雖然它是在非POD對象兌現,我想不出什麼理由來使用它的一個,只能想到用它來POD對象很少的原因。默認對齊是合理的。你不需要調整它。