2011-02-16 37 views
9

我想檢查某些類型的內存對齊T。直截了當的方式做,這是uintptr_t便攜式替代

if (((uintptr_t)&var & __alignof(T) - 1) == 0) ... 
然而

uintptr_t不是現有的C++的一部分標準,它不被一些編譯器的支持,所以我在尋找一種便攜式替代的方式來做到這一點,std::ptrdiff_t看起來不錯爲了我。 std::ptrdiff_t保證能夠存儲兩個指針之間的差異,但誰說這些指針之一不能是空指針?在這種情況下,std::ptrdiff_t必須至少與指針本身的大小相同。

template <typename T> bool is_properly_aligned(const T* const ptr) 
{ 
    std::ptrdiff_t diff = (ptr - static_cast<T*>(0)) * sizeof(T); 
    return ((diff & __alignof(T) - 1) == 0); 
} 

或類似的(由sizeof(T)擺脫乘法)

template <typename T> bool is_properly_aligned(const T* const ptr) 
{ 
    std::ptrdiff_t diff = 
     reinterpret_cast<const char*>(ptr) - static_cast<const char*>(0); 
    return ((diff & __alignof(T) - 1) == 0); 
} 

你怎麼看待這樣的一種解決方案是什麼?它足夠便攜嗎?我不明白爲什麼會失敗,但我想證實。

謝謝。

回答

1

我不知道這裏的問題是什麼。 「你怎麼看?」我認爲ptrdiff_t確實是表示兩個指針之間差異的正確數據類型,但是如果它們沒有指向來自簡單分配的連續內存塊(並且作爲推論,既不是被比較的兩個指針的值應該是NULL)。

+0

你寫了`我認爲ptrdiff_t確實是正確的數據類型來表示兩個指針之間的區別`。我的問題是你怎麼看,是否可移植到將指針整數表示存儲在ptrdiff_t中? – ledokol 2011-02-17 12:36:59