C++,检查实例是否在内存中出现在另一个之前?
C++, Check if Instance comes before Another in memory?
我有 2 个指向 C++ 节点的指针:
MallocMetadata *first_node, MallocMetadata *second_node
我如何检查 first_node 是否在 second_node 之前在内存中排在第一位(在堆中和首先我指的是较低地址)。
是否正确使用:if(first_node < second_node)
?
假设我想检查 first_node 在内存中的位置是否是 8 的乘积如何做到这一点:
我试过了:
assert(first_node%8 ==0);
但是,没有编译,我得到:
Invalid operands to binary expression ('MallocMetadata *' and 'int')
您可以使用 reinterpret_cast 将您的指针转换为 std::intptr_t
或 std::uintptr_t
,然后用它做任何您想做的事情,因为示例:
if(first_node_intptr < second_node_intptr) {...}
// or
if(first_node_intptr % 8 == 0) {...}
但你应该记住:
If the types std::intptr_t and std::uintptr_t exist, they are guaranteed to be long enough to hold a void* (and hence any pointer to object type). However, they are not guaranteed to be long enough to hold a function pointer.
Conversion between pointer and integer
您还应该意识到这种方法的缺点,@PeteBecker 在下面指出了这一点。
我有 2 个指向 C++ 节点的指针:
MallocMetadata *first_node, MallocMetadata *second_node
我如何检查 first_node 是否在 second_node 之前在内存中排在第一位(在堆中和首先我指的是较低地址)。
是否正确使用:
if(first_node < second_node)
?假设我想检查 first_node 在内存中的位置是否是 8 的乘积如何做到这一点:
我试过了:
assert(first_node%8 ==0);
但是,没有编译,我得到:
Invalid operands to binary expression ('MallocMetadata *' and 'int')
您可以使用 reinterpret_cast 将您的指针转换为 std::intptr_t
或 std::uintptr_t
,然后用它做任何您想做的事情,因为示例:
if(first_node_intptr < second_node_intptr) {...}
// or
if(first_node_intptr % 8 == 0) {...}
但你应该记住:
If the types std::intptr_t and std::uintptr_t exist, they are guaranteed to be long enough to hold a void* (and hence any pointer to object type). However, they are not guaranteed to be long enough to hold a function pointer.
Conversion between pointer and integer
您还应该意识到这种方法的缺点,@PeteBecker 在下面指出了这一点。