C++,检查实例是否在内存中出现在另一个之前?

问题描述

我有 2 个指向 C++ 节点的指针:

MallocMetadata *first_node,MallocMetadata *second_node

如何检查 first_node 是否在 second_node 之前首先出现在内存中(在堆中和第一个我的意思是低地址)。

  1. 是否真的使用:if(first_node < second_node)

  2. 假设我想检查 first_node 在内存中的位置是否是 8 的乘积,如何执行此操作:

我试过了:

assert(first_node%8 ==0);

但是,不编译,我得到:

二进制表达式的无效操作数('MallocMetadata *' 和 'int')

解决方法

您可以使用 reinterpret_cast 将您的指针转换为 std::intptr_tstd::uintptr_t,然后使用它做任何您想做的事情,例如:

if(first_node_intptr < second_node_intptr) {...}
// or
if(first_node_intptr % 8 == 0) {...}

但你应该记住:

如果类型 std::intptr_t 和 std::uintptr_t 存在,它们保证足够长以容纳一个 void* (因此任何指向对象类型的指针)。但是,它们不能保证足够长以保存函数指针。

Conversion between pointer and integer

您还应该意识到这种方法的缺点,@PeteBecker 在下面指出了这一点。