C++用指针算法实现PARROW类

C++用指针算法实现PARROW类,c++,C++,在以下代码中: using Previous = std::atomic<void*>; template<class T> struct Element{ Previous previous; T value; } 其中T可能是非标准布局 另外,我清楚地看到我不能用这个。但是,对于这种特殊情况,指针算法可能会起作用?答案是:它取决于编译器 如果您有一个64位编译器,且SizeOffPrevious为4且T为指针数据类型,则至少大多数编译器会在previ

在以下代码中:

using Previous = std::atomic<void*>;
template<class T>
struct Element{
    Previous previous;
    T value;
}
其中T可能是非标准布局


另外,我清楚地看到我不能用这个。但是,对于这种特殊情况,指针算法可能会起作用?

答案是:它取决于编译器

如果您有一个64位编译器,且SizeOffPrevious为4且T为指针数据类型,则至少大多数编译器会在previous和value之间添加4个额外字节

您使用以下命令获取的指针:

(void *)(((unsigned char *)value) - sizeof(Previous)
。。。在本例中,将指向previous后面的第一个字节

但是,可以用以下表达式替换SizeOffPrevious:

(int)&(((Element *)NULL)->value)
很抱歉,上面的表达式是C表达式;我的C++不是最好的。 此表达式应始终保持不变:父结构中元素的地址偏移量

编辑

理论上,可能有编译器执行空指针检查,这将导致在使用上述表达式时出错

在这种情况下,以下表达式将执行此操作:

((int)&(x.value) - (int)&x)

。。。而x是任何对象,例如数据类型元素的局部变量。

否:我建议减少黑客攻击,更多地修改设计。仅当结果是指向属于同一数组的元素的指针或超出该数组末尾的元素时,才允许执行指针算术&x的行为类似于一个元素数组。其他一切都是未定义的。我真正想要的是一个模板对象*运算符成员*成员,成员对象::*ptr,这样你就可以从指向成员的指针中减去指向成员的指针,得到指向包含对象的指针。int&Element*NULL->value-这将返回父对象和值之间的偏移量,对吗?@tower123:是的,应该是这样。至少在C语言中是这样。我不知道所有的C++变体;例如,C++将不允许你做指针运算……你需要检查T的对齐方式,知道有多少填充被引入;你不能假设它是4。@DanielH我修改了我的答案。第二句话仍然说它将添加4个字节,如果t是char、char[12]、uint32\u t或任何其他4字节或更少对齐的类型,这就不是真的。
((int)&(x.value) - (int)&x)