我正在使用兩個不同的庫來執行原子操作。我用一個鍵(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.
我會懷疑一些對齊問題,試着把關鍵最後。 – Surt
試過了。不用找了。 – arunmoezhi
嘗試添加一個static_assert(sizeof(AO_double_t)== 16,「不是16」); – Surt