假设我需要一个函数,该函数检查两个任意缓冲区是否交错*。我想到的一个简单的主意是:
bool isInterleaved(uint* buf1, // pointer to first buffer
uint* buf2, // pointer to second buffer
uint len1, // length of first buffer
uint len2, // length of second buffer
uint stride1, // stride length of first buffer
uint stride2) // stride length of second buffer
{
... // first some sanity checks like (NULL != buf), (0U < len),...
bool retval = false;
if ((len1 == len2) && (2U == stride1) && (2U == stride2))
{
if ((&buf1[1] == &buf2[0]) ||
(&buf2[1] == &buf1[0]))
{
retval = true;
}
}
return retval;
}
在纸面上,它看起来足够好,快速测试是肯定的。但是,In C and C++, the comparison of pointers to objects is only strictly defined if the pointers point to members of the same object, or elements of the same array.
我的示例-特别是带有(&buf1[1] == &buf2[0])
的行和后面的行-构成未定义的行为吗?如果是,如何在不依赖未定义行为的情况下执行这样的检查?
*请参阅编辑历史记录以获取交错数据的示例,或检查wikipedia article on interleaving。正如评论所暗示的,这不是一个“错误的词”。
我的示例构成未定义的行为吗?
所提供的代码没有未定义的行为。指针可以与==
进行比较。即使它们指向不同的对象。
您要引用的规则适用于<
>
<=
和>=
运算符。在“不同对象”上使用这些运算符是未定义的行为。在指针上的关系运算符的标准语义的草案可以在C99 6.5.8p5中找到。