我已经读过一个double变量(8个字节)必须是8个字节对齐.
现在,如果我正在为我的程序编写整个代码,那么我可以使double变量8字节对齐而没有任何问题.
但是说我有以下场景:我创建了一个double在堆栈上创建变量的函数,并且我将此函数提供给其他人在他的程序中使用它.现在当我的函数被调用时,我的函数将不知道是否double将在可被8分割的地址上创建变量!
可以解决这个问题(请注意,我不关心不对齐我的double变量可以忽略的性能损失,但我只是想知道这个问题是否有解决方案)?
在函数里,你可以强制堆栈是通过设置为零三个8字节对齐至少显著位的esp.这可以通过以下and指令来实现:
andl $0xfffffff8, %esp
Run Code Online (Sandbox Code Playgroud)
结果esp将是相等的(即:esp已经对齐)或低于前一个.由于x86架构上的堆栈向下增长,因此会在堆栈上分配大小介于0到7个字节之间的填充.
注意,如果esp在执行and指令之前已经是8字节对齐(即:它的三个最低有效位已经为零),则在堆栈上不会创建任何填充(即:0字节的填充).
离开该功能时,esp如果您使用常用功能序言和结语,将恢复之前保存的值:
myFunction:
//prologue: save the current stack frame
pushl %ebp
movl %esp, %ebp
andl $0xfffffff8, %esp
//stack now 8-byte aligned
//...
leave //restore the previous stack frame
ret
Run Code Online (Sandbox Code Playgroud)
这样,先前分配的填充现在将从堆栈中释放.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |