2010-12-22 32 views
1

是否可以在不使用轉換的情況下對void指針執行算術運算?有沒有可能對voidof指針執行算術運算?

如果我有一個泛型函數,它需要一個未知類型的指針和一個指定類型大小的整數。是否有可能只用兩個參數來執行一些指針運算?

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

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

回答

1
  • 警告 - 下面可能是誤導。正如其他人在評論中指出的那樣(特別感謝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*添加在字節偏移。

4

不,因爲編譯器不知道void指針指向的項目大小。您可以將指針轉換爲(char *)以執行上面的操作。

+0

現在使用鑄造來做到這一點是一個糟糕的主意 - 一些編譯器(特別是GCC)將無法識別「別名」指針,並因此導致中斷優化。 – Steve314 2010-12-22 08:46:42

+0

那麼在void指針上執行投射是個好主意? – user385261 2010-12-22 08:56:47