c++ - 结构 tbb 与 atomic_ops 的内存对齐

标签 c++ c gcc atomic tbb

我使用两个不同的库来执行原子操作。我创建了一个二叉树节点结构,其中包含一个键(8 个字节)和指向左右子节点(各 8 个)的指针。

预期的节点大小为 24 字节。 如果我使用英特尔 TBB 库,我会得到预期的行为。但是,如果我使用 HP 的 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

编辑

我的假设是 node24 的大小四舍五入到最接近的 8,而 node32 的大小四舍五入到最接近的 16(AO_double_t 的大小)。所以我添加了一个额外的 value 变量(8 字节)以使节点大小为 32。现在我希望 node32 的大小为 32 但它变成了 48。我不不明白为什么在已经对齐到 32 的情况下还要多 16 个字节的填充。

最佳答案

原子的非标准实现没有太多理由在它们使用的数据类型上保持一致,大小和对齐方式可以不同。根据编译器标志,在某些情况下,一个甚至可以使用锁定版本,而另一个使用 native 指令。只是不要混合它们。

现代 C 和 C++ 具有内置于语言中的原子,如果可以,请使用它们。它们甚至被设计为在两者之间兼容。

关于c++ - 结构 tbb 与 atomic_ops 的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177282/

相关文章:

c++ - 使用不完整类型显式实例化函数模板

c++ - GCC 允许隐式 int 到指针转换?

c - 选择排序算法(C)

c - 字体压缩! RLE 或霍夫曼或什么都没有?

C 程序打印字符串的相同地址,C 程序的意外输出

c++ - 显式特化中不允许存储类

python - C++ 到更简单的语言(Python、Lua 等)转换器?

c++ - Windows Universal - 如何检查用户是否已登录 Microsoft 帐户?

c - linux 上的段错误-在 windows 上工作

Cortex-M4 锁定