假设我需要一个函数来检查两个任意缓冲区是否交错*。想到的一个直截了当的想法是:
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;
}
在纸面上,它看起来足够好,快速测试是积极的。但是,在 C 和 C++ 中,仅当指针指向同一对象的成员或同一数组的元素时,才严格定义指向对象的指针的比较。
我的示例 - 特别是后面的那一行(&buf1[1] == &buf2[0])
- 是否构成未定义的行为?如果是,我如何在不依赖未定义行为的情况下实现这样的检查?
*请参阅编辑历史以获取交错数据的示例或查看有关交错的维基百科文章。正如评论所暗示的,这不是“一个错误的词”。