gpt4 book ai didi

visual-c++ - uintptr_t 可移植替代品

转载 作者:IT王子 更新时间:2023-10-28 23:34:56 27 4
gpt4 key购买 nike

我想检查一些类型 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 确实是表示两个指针之间差异的正确数据类型,但是如果两个指针没有指向来自简单分配的连续内存块(并且作为推论,两者都不是被比较的两个指针中的一个应该永远是 NULL)。

关于visual-c++ - uintptr_t 可移植替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com