首页 > 解决方案 > 如何在 LSB 指针位中正确存储额外数据?

问题描述

我有一个GSList来自 GTK/glib 2,那些只存储完整的指针,我真的不想要额外的分配。我如何做一些小技巧来在这些指针中存储额外的数据?

我想我不能只拿一个指针然后做tagged_ptr = ptr | 1(事实上,当我尝试时,编译器会非常大声地抱怨)。我不知道该怎么做。

但是,这对于单个函数肯定是本地的,并且GSList(或指针)不会泄漏到其余代码中。

标签: cpointersbit-manipulationglib

解决方案


要对指针的数值执行算术运算(与指针算术相反,它是不同的且受高度约束的),您需要来回转换为适当的整数类型。如果stdint.h定义了UINTPTR_MAX,则要使用的适当类型是uintptr_t. 如果没有,则没有合适的类型,并且您的(不可移植的)hack 无法在该特定实现上工作。

请注意,您还存在假设指针具有低未使用位的问题。如果_Alignof(max_align_t)大于 1,这可能是一个合理的假设,假设实现遵循标准的意图,即转换以uintptr_t反映实现的地址模型(而不是一些任意注入)。但如果没有,那你就不走运了。


推荐阅读