gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:14:35 25 4
gpt4 key购买 nike

我使用两个不同的库来执行原子操作。我创建了一个二叉树节点结构,其中包含一个键(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com