C++ 使用指针算术获取 parrent 类

C++ Getting parrent class with pointer arithmetic

本文关键字:获取 parrent 指针 C++      更新时间:2023-10-16

在下面的代码中:

using Previous = std::atomic<void*>;
template<class T>
struct Element{
Previous previous;
T value;
}

我可以做指针算术来从T*获得Element<T>*吗? 喜欢这个:

template<class T>
Element<T>* getElement(T* value){
return static_cast<Element<T>*>(static_cast<void*>(reinterpret_cast<unsigned char *>(value) - sizeof(Previous)));
}

其中T可能是非标准布局。

附言我清楚地看到我不能为此使用偏移量。但是,对于这种特殊情况,指针算术可能会起作用?

答案是:这取决于编译器!

如果您有一个 64 位编译器,并且sizeof(Previous)为 4,T是指针数据类型,则编译器(至少大多数编译器(将在previousvalue之间添加 4 个额外的字节。

您获得的指针:

(void *)(((unsigned char *)value) - sizeof(Previous)

。在这种情况下,将指向previous后的第一个字节!

但是,您可以将sizeof(Previous)替换为以下表达式:

(int)&(((Element *)NULL)->value)

(抱歉,上面的表达式是 C 表达式;我的C++不是最好的。

此表达式应始终为常量:父结构中元素的地址偏移量。


编辑

从理论上讲,可能会有编译器执行NULL指针检查,这在使用上述表达式时会导致错误。

在这种情况下,以下表达式将完成这项工作:

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

。而x是数据类型Element的任何对象(例如局部变量(。