typedef union {void *ptr; int id;} handle;这不安全对吧?
我看到唯一的id是基于64位指针的内存位置值。然后,可以使用唯一的id进行匹配,反之亦然,指针可以用于匹配的"id“。
这似乎没问题,但我宁愿去问专业人士。
(供参考)我在nuklear.h --一个头文件gui库中注意到了这一点。
发布于 2020-10-11 19:58:30
工会本身是完全安全的。
将联合用于类型双关,方法是将其写入联合的一个元素,然后读取另一个元素is...not,这样才是安全的。
类型
如果您想要一个包含指针的整数,通常需要使用uintptr_t或intptr_t,而不是只使用int。
运营
不过,这可能是不必要的。至少从事物的声音来看,您只需要一些值,使您能够唯一地标识一个对象,并能够比较两个对对象的引用/指针是否真正引用相同或不同的对象。假设是这样的话,你根本不需要转换成整数--只需将地址存储在指针中,然后比较它们。当比较不平等时,即使对于不相关的对象,也会得到有意义的结果。以下是C++标准的措辞:
(3.1) -如果一个指针表示一个完整对象的地址,而另一个指针代表一个不同的完整对象的最后一个元素的地址,则比较的结果不指定。
(3.2) -否则,如果指针都为null,都指向同一个函数,或者都表示相同的地址(6.8.2),则它们比较相等。
(3.3) -否则,指针比较不平等。
因此,指向同一个对象的两个指针比较相等。指向不同对象的两个指针比较不相等。你根本不需要转换成整数类型就能得到那么多(在C中也是如此)。
角箱
该(3.1)的第一条可能需要作更多的解释。您可以创建一个指针,指向数组结束后的一个指针,还可以将其与同一个数组中的其他指针进行比较(并且它需要比任何一个指针都要大)。但是,有一种情况是,没有指定结果。考虑:
int a[4];
int b;
if (a+4 == b) {
...
}在这种情况下,a+4可能等于也可能不等于b。不管是哪种方式都不能保证。但是请记住,a+4是一个不能取消引用的指针--它不是指向对象的指针。没有指向任何对象的指针落入这个角落的情况。
如果您想要在指针之间排序,这样您就可以比较类似于a < b的东西,那么事情就会变得更加复杂,并且在C和C++之间也会有所不同。在C语言中,实现这一点的唯一方法是(如上文所述)将每个指针转换为intptr_t (或uintptr_t)并比较这些指针。每次转换都要小心一次,但是要永久存储结果,因为转换不一定是稳定的。
在C++中,您可以使用std::less来比较指针的排序,即使它们是无关的,所以直接使用a < b不会给出有意义的结果。对于一些不相关的对象( a和b ),它不能保证它们的顺序是什么,但它确实保证了结果是一致的(重新进行相同的比较总是会给出相同的结果)和传递(所以如果a<b和b<c,那么a<c)。
摘要
至少根据您在这个问题中概述的内容,似乎根本没有理由将其转换为整数。除非你需要一些你还没说过的东西,那就把地址存起来比较一下,这样你就很好了。
https://stackoverflow.com/questions/64307868
复制相似问题