Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ uintptr\t便携式替代方案_Visual C++_Memory_Alignment_Pointer Arithmetic - Fatal编程技术网

Visual c++ uintptr\t便携式替代方案

Visual c++ uintptr\t便携式替代方案,visual-c++,memory,alignment,pointer-arithmetic,Visual C++,Memory,Alignment,Pointer Arithmetic,我想对某些类型的T执行内存对齐检查。最简单的方法是 if (((uintptr_t)&var & __alignof(T) - 1) == 0) ... < > > 代码> uTutpRtTyt/COD>不是现有C++标准的一部分,它不被编译器所支持,所以我在寻找一种可移植的替代方法来实现这一点,并且 STD::pTrDeFifft 对我来说很好。code>std::ptrdiff_t保证能够存储两个指针之间的差异,但谁说其中一个指针不能是空指针?在这种情况下,std::ptr

我想对某些类型的
T
执行内存对齐检查。最简单的方法是

if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...
< > > <>代码> uTutpRtTyt/COD>不是现有C++标准的一部分,它不被编译器所支持,所以我在寻找一种可移植的替代方法来实现这一点,并且<代码> STD::pTrDeFifft 对我来说很好。code>std::ptrdiff_t保证能够存储两个指针之间的差异,但谁说其中一个指针不能是空指针?在这种情况下,
std::ptrdiff\u 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);
}
你认为这样的解决方案怎么样?它够便携吗?我不认为这会失败,但是我想确认一下


谢谢。

我不确定这里的问题是什么。“你认为呢?”我认为ptrdiff_t确实是表示两个指针之间差异的正确数据类型,但是如果两个指针没有指向来自简单分配的连续内存块,那么比较它们就没有什么意义了(作为推论,被比较的两个指针都不应该为空).

您编写了
我认为ptrdiff\u t确实是表示两个指针之间差异的正确数据类型。我的问题是,您认为,在ptrdiff\u t中存储指针整数表示是否可移植?您编写了
,但如果两个指针没有指向一个连续块,那么比较它们就没有什么意义了我们的内存来自一个简单的分配
。我不是在比较,我是在计算距离,目的是得到指针的整数表示。但是ptrdiff_t不是像int那样的数字类型。它甚至不能保证与int大小相同(在64位系统上,通常不是)。如果你想玩这样的游戏,你可以直接施放(int)ptr,并检查低位是否对齐。你写道:
但ptrdiff\u t不是像int那样的数字类型。
。从标准
中,结果的类型是实现定义的带符号整数类型
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);
}