首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于具有唯一整数id的指针的合并的安全性

关于具有唯一整数id的指针的合并的安全性
EN

Stack Overflow用户
提问于 2020-10-11 18:52:37
回答 1查看 80关注 0票数 0
代码语言:javascript
复制
typedef union {void *ptr; int id;} handle;

这不安全对吧?

我看到唯一的id是基于64位指针的内存位置值。然后,可以使用唯一的id进行匹配,反之亦然,指针可以用于匹配的"id“。

这似乎没问题,但我宁愿去问专业人士。

(供参考)我在nuklear.h --一个头文件gui库中注意到了这一点。

https://github.com/Immediate-Mode-UI/Nuklear

EN

回答 1

Stack Overflow用户

发布于 2020-10-11 19:58:30

工会本身是完全安全的。

将联合用于类型双关,方法是将其写入联合的一个元素,然后读取另一个元素is...not,这样才是安全的。

类型

如果您想要一个包含指针的整数,通常需要使用uintptr_tintptr_t,而不是只使用int

运营

不过,这可能是不必要的。至少从事物的声音来看,您只需要一些值,使您能够唯一地标识一个对象,并能够比较两个对对象的引用/指针是否真正引用相同或不同的对象。假设是这样的话,你根本不需要转换成整数--只需将地址存储在指针中,然后比较它们。当比较不平等时,即使对于不相关的对象,也会得到有意义的结果。以下是C++标准的措辞:

(3.1) -如果一个指针表示一个完整对象的地址,而另一个指针代表一个不同的完整对象的最后一个元素的地址,则比较的结果不指定。

(3.2) -否则,如果指针都为null,都指向同一个函数,或者都表示相同的地址(6.8.2),则它们比较相等。

(3.3) -否则,指针比较不平等。

因此,指向同一个对象的两个指针比较相等。指向不同对象的两个指针比较不相等。你根本不需要转换成整数类型就能得到那么多(在C中也是如此)。

角箱

该(3.1)的第一条可能需要作更多的解释。您可以创建一个指针,指向数组结束后的一个指针,还可以将其与同一个数组中的其他指针进行比较(并且它需要比任何一个指针都要大)。但是,有一种情况是,没有指定结果。考虑:

代码语言:javascript
复制
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不会给出有意义的结果。对于一些不相关的对象( ab ),它不能保证它们的顺序是什么,但它确实保证了结果是一致的(重新进行相同的比较总是会给出相同的结果)和传递(所以如果a<bb<c,那么a<c)。

摘要

至少根据您在这个问题中概述的内容,似乎根本没有理由将其转换为整数。除非你需要一些你还没说过的东西,那就把地址存起来比较一下,这样你就很好了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64307868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档