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);
}
你怎麼看待這樣的一種解決方案是什麼?它足夠便攜嗎?我不明白爲什麼會失敗,但我想證實。
謝謝。
你寫了`我認爲ptrdiff_t確實是正確的數據類型來表示兩個指針之間的區別`。我的問題是你怎麼看,是否可移植到將指針整數表示存儲在ptrdiff_t中? – ledokol 2011-02-17 12:36:59