0

我正在阅读一些关于无锁双向链表的论文。在这些论文中,他们将下一个和上一个节点的地址和一个标志存储在一个单词(int)中。

是不是因为在 32 位架构中,所有地址都以 4 字节边界对齐,所以所有地址都是 4 的倍数?

如果原因是我所说的,这段代码可以吗?

const int dMask = 1;
const int pMask = ~dMask;

int store(void* pPointer, bool pDel)
{
    return reinterpret_cast<int>(pPointer) | (int)pDel;
}

void load(int pData, void** pPointer, bool* pDel)
{
    *pPointer = reinterpret_cast<void*>(pData & pMask);
    *pDel = pData & dMask;
}

还有一个问题:在其他平台如Android移动设备上,上述思路是否正确?

4

2 回答 2

2

你或多或少是正确的。这是非常低级代码中的公共空间优化。它不是便携式的。intptr_t(您可以通过使用而不是使其更便携int。)

此外,当然,对齐只适用于指向更复杂类型的指针。achar*不一定是对齐的。(我见过这种使用的唯一一次是在内存管理的实现中,其中涉及的所有块都需要针对任何类型进行充分对齐。)

最后,我不确定这篇论文的作者想要做什么,但是您发布的代码不能在多线程环境中使用,至少在现代机器上是这样。为了确保一个线程中的修改可以在另一个线程中看到,您需要使用原子类型,或者某种栅栏或 membar。

于 2013-10-11T15:26:44.423 回答
0

大多数 32 位体系结构中的地址不是以 4 字节边界存储的,而是以 1 字节存储的。它们以 4 字节(典型的字长)增量从内存中读取。没有看到这个双向链表的代码,听起来他们正在执行一些关于容器如何存储数据的规则。

于 2013-10-11T15:23:41.813 回答