有没有可能对voidof指针执行算术运算?

问题描述:

是否可以在不使用转换的情况下对void指针执行算术运算?有没有可能对voidof指针执行算术运算?

如果我有一个泛型函数,它需要一个未知类型的指针和一个指定类型大小的整数。是否有可能只用两个参数来执行一些指针运算?

void* Function(void* ptr, int size); 
+0

只有在GCC中才有可能。 – ruslik 2010-12-22 08:34:09

  • 警告 - 下面可能是误导。正如其他人在评论中指出的那样(特别感谢Steve Jessop),以下基于联合的类型双关语在标准C++中与基于cast的双关语没有特别的保证,并且使用强制转换为char*来执行指针算术可能会更加便携使用工会转换为整数。

由于标准C++中指针的类数组语义,您需要某种形式的类型双引号来完成此操作。我会通过使用基于工会的双关语骗...

inline void* Ptr_Add (void* p1, std::ptrdiff_t p2) 
{ 
    union 
    { 
    void*   m_Void_Ptr; 
    std::ptrdiff_t m_Int; 
    } l_Pun; 

    l_Pun.m_Void_Ptr = p1; 
    l_Pun.m_Int  += p2; 

    return l_Pun.m_Void_Ptr; 
} 

我有这个确切的代码在我的图书馆,有一些人做面向字节的指针运算和位运算一起。因为基于投射的双关语可能很脆弱(优化器中的指针别名分析可能不会识别别名,所以导致的代码行为异常),因此存在基于联合的双关语。

如果你使用offsetof,你需要一组类似于这个的函数。它们并不是很好,但它们比在指针上应用偏移量时所做的所有处理都要好得多。

由于ruslik提示,存在GCC的扩展,它(如果你不介意的话不可移植的代码)把一个void为1的大小,所以你可以使用+void*添加在字节偏移。

不,因为编译器不知道void指针指向的项目大小。您可以将指针转换为(char *)以执行上面的操作。

+0

现在使用铸造来做到这一点是一个糟糕的主意 - 一些编译器(特别是GCC)将无法识别“别名”指针,并因此导致中断优化。 – Steve314 2010-12-22 08:46:42

+0

那么在void指针上执行投射是个好主意? – user385261 2010-12-22 08:56:47