什么时候应该在汇编中使用显式对齐指令?

jen*_*ena 8 assembly alignment

我花了一些时间进行汇编编程(特别是Gas),最近我学习了align指令.我想我已经理解了它的基础知识,但我想更深入地了解它的性质以及何时使用对齐.

例如,我想知道一个简单的C++ switch语句的汇编代码.我知道在某些情况下,switch语句基于跳转表,如下面几行代码所示:

    .section    .rodata
    .align 4
    .align 4
.L8:
    .long   .L2
    .long   .L3
    .long   .L4
    .long   .L5
    ...
Run Code Online (Sandbox Code Playgroud)

.align 4在下一个4字节边界上对齐以下数据,以确保获取这些内存位置是有效的,对吗?我认为这样做是因为在switch语句之前可能会发生导致错位的事情.但为什么实际上有两次调用.align?在调用.align时是否有任何经验法则,或者只要在新的数据块存储在内存中并且之前的某些内容可能导致错位,它是否应该完成?

对于数组,一旦数组占用至少32个字节,似乎就在32字节边界上进行对齐.以这种方式执行它是否更有效还是32字节边界的另一个原因是什么?

我很欣赏任何有关文学的解释或暗示.

Ric*_*key 8

.align由于编译器在内部工作的方式,有多个指令; 一个本来就足够了,只发出一个需要额外的工作.

就一般的对齐而言,这是一个复杂的主题,但这里有一篇关于英特尔x64的文章,讨论了你感兴趣的一些问题:

其他架构可能大不相同.