我正在使用编程语言实现,我想知道如何(生病)建议将服务指针的最低有效位用于存储数据。
是否有任何主要平台(AMD64 / {Windows / Linux / MacOS},Arm / {iOS,Android})其中2个最低有效位在函数指针中是否为非零?也就是说,主要平台上代码的对齐是否至少为4?
答案 0 :(得分:6)
我可以告诉你,Apple的64位运行时(我认为ARM64和Intel都是如此)广泛使用标志的最低有效位。在Objective-C中,一切都是一个对象,为了与C兼容,几乎每个对象都存在于堆上并由其指针记录。在64位模式下,它们允许非常小的对象通过将它们装入62位而使用低位来表示这不是指针而是文字对象。因此,您可以将短字符串,对象包装的32位及以下数字等直接放入“指针”中,而不是将任何内容放在堆上。
然而,Apple并没有使用32位运行时(事件是'现代',如iOS)。所以可能值得研究为什么会这样。不可否认,这可能只是因为PowerPC带来的一些架构怪癖。
正如我在评论中指出的那样(以及为什么现在将其标记为社区维基),C标准区分了功能指针的存储以及所有其他类型的指针。所以上面的注释可能相关也可能不相关 - 我仍然认为这是因为闭包与数据和函数是一个单独的东西,在编译语言中,代码本身通常是事先编译的,闭包本身就是数据。填补空白。但我想说的是,有一些航运,强大的系统可以假设他们可以在需要对齐的系统上重用最不重要的指针位。
答案 1 :(得分:3)
ARM有两种模式 - 传统(AKA“ARM”)和Thumb。在ARM模式下,指令在4字节边界上对齐,在Thumb - on 2字节。 CPU将第0位用于切换模式的调用:从ARM转到Thumb,将branch-and-switch-mode命令发送到最右边的位设置为1的地址。
原生用户区代码的首选模式恰好是两个最流行的基于ARM的平台(iOS和Android)上的Thumb。但必须支持与ARM的互通。因此,地址中实际上没有未使用的位。
答案 2 :(得分:1)
在ARM上,低位具有特殊含义:它在Thumb和传统模式之间切换。在Thumb模式下,指令是16位对齐的,因此使用了这两个位。
在AMD64和x86上,根据优化模式,功能可能位于奇数地址。这意味着低两位始终在使用中。
答案 3 :(得分:-1)
没有主要的现代平台不需要其指令至少4字节对齐,我不知道任何C编译器为了自己的目的使用低字节。 Blah blah blah关于在C中使用铸造指针进行操作的未定义行为,但你是安全的。
编辑:正如下面所指出的,对于ARM Thumb,你只得到一位,你需要确保在跳转之前清除它。对于i386,一些链接器在禁用优化时不会进行对齐。