2015-10-16 65 views
3

我正在使用兩個不同的庫來執行原子操作。我用一個鍵(8字節)和左右兒童指針(每個8個)創建一個二叉樹節點結構。內存對齊結構tbb vs atomic_ops

期望的節點大小是24個字節。 如果我使用英特爾TBB庫,我會得到預期的行爲。但是,如果使用惠普的atomic_ops而庫我看到節點的大小32

編譯器使用:

gcc4.6,gcc4.8,ICC 2013

機弓:x86_64的

代碼:

#include<stdio.h> 
#include<stdlib.h> 
#include<tbb/atomic.h> 
#include<atomic_ops.h> 

struct node24 
{ 
    unsigned long key; //size 8 
    tbb::atomic<struct node*> child[2]; //size 2*8=16 
}; 

struct node32 
{ 
    unsigned long key; // size 8 
    AO_double_t child; // size 16 
}; 

int main() 
{ 
    printf("TBB   node size: %d\n",sizeof(node24)); 
    printf("HP atomicOps node size: %d\n",sizeof(node32)); 
} 

輸出

$ ./foo.o 
TBB   node size: 24 
HP atomicOps node size: 32 

EDIT

我的假設爲node24大小上舍入到最近的8和用於node32大小上舍入到最接近的16(AO_double_t的大小)。所以我增加了一個額外的value變量(8字節),使節點大小爲32.現在我預計node32的大小爲32,但它變成了48.我不明白爲什麼額外的16個字節的填充已經是已經存在了排列在32.

+0

我會懷疑一些對齊問題,試着把關鍵最後。 – Surt

+0

試過了。不用找了。 – arunmoezhi

+0

嘗試添加一個static_assert(sizeof(AO_double_t)== 16,「不是16」); – Surt

回答

0

原子的非標準實現應該在它們使用的數據類型中達成一致的原因並不多,尺寸和對齊方式可能不同。根據編譯器標誌,在另一些使用本地指令的情況下,甚至可以使用鎖定版本。只是不要混合它們。

現代C和C++具有構建到語言中的原子,如果可以的話,使用它們。它們甚至被設計成在兩者之間兼容。

0

comment尖,node32 ::孩子使用

typedef __m128 double_ptr_storage; 

定義,它具有16對準。因此,編譯器把附加填充第一key字段之後,因爲其大小隻有8個字節,需要另外8個字節的填充空間來修復對齊。當你添加第三個字段時(我認爲最後?)編譯器必須添加更多的填充以保持數組中的對齊。