c - 如何在 LSB 指针位中正确存储额外数据?
问题描述
我有一个GSList
来自 GTK/glib 2,那些只存储完整的指针,我真的不想要额外的分配。我如何做一些小技巧来在这些指针中存储额外的数据?
我想我不能只拿一个指针然后做tagged_ptr = ptr | 1
(事实上,当我尝试时,编译器会非常大声地抱怨)。我不知道该怎么做。
但是,这对于单个函数肯定是本地的,并且GSList
(或指针)不会泄漏到其余代码中。
解决方案
要对指针的数值执行算术运算(与指针算术相反,它是不同的且受高度约束的),您需要来回转换为适当的整数类型。如果stdint.h
定义了UINTPTR_MAX
,则要使用的适当类型是uintptr_t
. 如果没有,则没有合适的类型,并且您的(不可移植的)hack 无法在该特定实现上工作。
请注意,您还存在假设指针具有低未使用位的问题。如果_Alignof(max_align_t)
大于 1,这可能是一个合理的假设,假设实现遵循标准的意图,即转换以uintptr_t
反映实现的地址模型(而不是一些任意注入)。但如果没有,那你就不走运了。
推荐阅读
- bash - bash 脚本中的“`$@': not a valid identifier”错误
- python - Python 构造函数应该启动服务还是只初始化变量?
- python - 当鼠标光标位于屏幕上的任何位置时,如何在 tkinter 上使用鼠标滚轮滚动滚动条?
- sql - 对于 n 个多边形,Postgres st_difference 执行时间太长
- python - 将我的 Tensorflow 模型和代码导出到另一台 PC
- r - R的png函数中res(分辨率)的默认值是多少?
- powershell - 我可以在 Windows 上运行 Get-WindowsFeature PowerShell 命令吗?
- ionic4 - 如何在单击推送通知时重定向到 ionic4 中的特定路由?
- oracle - 如何从 oracle report builder 6i 生成阿拉伯语 PDF?
- c# - 允许在电子邮件域验证中使用连字符的正则表达式