我已经读过double
变量(8个字节)必须是8个字节对齐。
现在如果我正在为我的程序编写整个代码,那么我可以使double
个变量8字节对齐而没有任何问题。
但是我说我有以下场景:我创建了一个在堆栈上创建double
变量的函数,并且我将此函数提供给其他人在他的程序中使用它。现在,当调用我的函数时,我的函数将不知道是否将在可被8分割的地址上创建double
变量!
是否可以解决这个问题(请注意,我并不关心因未调整double
变量导致的性能损失可忽略不计,但我只是想知道是否有解决此问题的方法?)
答案 0 :(得分:6)
在函数内部,您可以通过将esp
的三个最低有效位设置为零来强制堆栈为8字节对齐。这可以通过and
指令来实现:
andl $0xfffffff8, %esp
结果esp
将相等(即:esp
已经对齐)或低于前一个esp
。由于x86架构上的堆栈向下,因此会在堆栈上分配大小介于0到7个字节之间的填充。
注意,如果and
在执行esp
指令之前已经是8字节对齐(即:它的三个最低有效位已经为零),则根本没有填充(即:填充<在堆栈上创建了em> 0字节。
离开该功能时,如果您使用常用功能序言和结语,将恢复之前保存的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
值:
public class SomeMsgAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{
}
public void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.Controller.ViewBag.Department= "Department";
}
}
这样以前分配的填充现在将从堆栈中释放出来。