是否可以在不使用轉換的情況下對void指針執行算術運算?有沒有可能對voidof指針執行算術運算?
如果我有一個泛型函數,它需要一個未知類型的指針和一個指定類型大小的整數。是否有可能只用兩個參數來執行一些指針運算?
void* Function(void* ptr, int size);
是否可以在不使用轉換的情況下對void指針執行算術運算?有沒有可能對voidof指針執行算術運算?
如果我有一個泛型函數,它需要一個未知類型的指針和一個指定類型大小的整數。是否有可能只用兩個參數來執行一些指針運算?
void* Function(void* ptr, int size);
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