有没有可能对voidof指针执行算术运算?
是否可以在不使用转换的情况下对void指针执行算术运算?有没有可能对voidof指针执行算术运算?
如果我有一个泛型函数,它需要一个未知类型的指针和一个指定类型大小的整数。是否有可能只用两个参数来执行一些指针运算?
void* Function(void* ptr, int size);
-
警告 - 下面可能是误导。正如其他人在评论中指出的那样(特别感谢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 *)以执行上面的操作。
现在使用铸造来做到这一点是一个糟糕的主意 - 一些编译器(特别是GCC)将无法识别“别名”指针,并因此导致中断优化。 – Steve314 2010-12-22 08:46:42
那么在void指针上执行投射是个好主意? – user385261 2010-12-22 08:56:47
只有在GCC中才有可能。 – ruslik 2010-12-22 08:34:09