![]() |
1
15
这在标准C中是可能的,尽管不如非标准方法有效。
上述引用的段落来自
C11 standard
适用于关系运算符,即。
具体而言,关于等式运算符的第6.5.9p6节规定:
因此,您可以通过使用以符合标准的方式检查重叠
例如:
一种更有效的方法是仅检查一个对象的第一个字节的地址与另一个对象中每个字节的地址,因为如果存在重叠,则一个对象必须在另一个内:
|
![]() |
2
2
公认的答案是通过参考语言标准的适当部分来解决OP的问题。但是,如果第一个对象(数组)是第二个对象(阵列)的子集,使得第一个对象与第二个物体完全重叠,但排除了第二个目标的开始和结束元素,即像这样重叠,则在接受答案中发布的第二段代码将失败-
这篇文章只是为了解决@dbushpost第二个代码片段中的问题而进行的几次修改,并通过考虑所讨论的数组的元素类型的大小使其更加高效。
|
![]() |
3
0
您可以在线性时间中检查是否&obj1[i]==&obj2[0]对于一些i,或者&obj1[0]==&obj2[i]对于一些i,并以此方式确定是否存在重叠。 在执行此操作之前,您将obj1和obj2强制转换为uintptr_t,假设(没有证据)强制转换到uintpttr_t的指针的行为类似于char*,并计算i,j,使得&obj1[i]应该等于&obj2[j]根据您的假设,并且这两个指数都是有效的。由于比较相等或不相等的不相关指针不会调用UB,因此 可以 能够以这种方式证明阵列是重叠的。如果您的实现很奇怪,那么这没有帮助,但也不会给您带来错误的结果。如果数组不重叠,它也不起作用。在这种情况下,请返回第一种方法。 |
![]() |
Robert E. Brown · 嵌套类的嵌套类的访问权限 7 年前 |
![]() |
YSC · 通过成员指针访问受保护的成员:这是黑客行为吗? 7 年前 |
![]() |
Swift - Friday Pie · 交换数学运算的阶 7 年前 |
![]() |
Acorn · Linux内核的\uu is\u constexpr宏 7 年前 |
![]() |
Acorn · 检测宏中的整数常量表达式 7 年前 |
![]() |
Petr Skocik · 兼容类型并忽略C类型系统中的顶级限定符 7 年前 |