gpt4 book ai didi

c++ - 如何检查两个任意内存范围在 c/c++ 中不重叠

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:45 24 4
gpt4 key购买 nike

假设我需要实现一个非常通用的实用函数,它必须将一个缓冲区复制到另一个缓冲区。根据 c/c++ 标准,使用带有重叠内存的 memcpy 是 UB 另一方面,memmove 可能更慢。我希望能够在任何时候使用 memcmp 实现,并在需要时切换到 memmove。

void copy(const void* src, int src_size, void* dst, int dst_size, int count)
{
assert(src);
asserc(dst);
assert(0 < count);
assert(count < src_size);
assert(count < dst_size);

if (are_overlaped(src, dst, count))
std::memove(dst, src, count);
else
std::memcmp(dst, src, count);
}

按照c/c++标准,对任意指针进行比较或减法是UB。为了编写 are_overlaped 的简单实现,两个指针都必须指向同一数组的项目。所以这是一般情况下的 UB

bool are_overlaped(const void* first, const void* second, int size)
{
assert(first);
asserc(second);
assert(0 < size);

return std::abs(reinterpret_cast<const char*>(first)
- reinterpret_cast<const char*>(second)) < size;
}

所以我的问题是如何为任意指针正确实现 are_overlaped?还是有标准的方法来检查这个?

附言。带有拷贝的示例只是为了更好地理解的上下文。我想知道如何实现 are_overlaped 而不是使用或实现复制。

最佳答案

如果这 2 个指针不属于同一个数组,则指针比较是 UB,可以使用 std::less,例如:

template <typename T>
bool are_overlaped(const T* first, const T* second, int size)
{
// `first` and `second` should be arrays of size greater or equal to `size`
return first && second
&& (!std::less<>{}(second, first) && std::less<>{}(second, first + size)
|| !std::less<>{}(first, second) && std::less<>{}(first, second + size));


}

关于c++ - 如何检查两个任意内存范围在 c/c++ 中不重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699331/

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