当我的程序启动时,堆栈是否与 4 字节边界对齐?
Is the stack aligned to a 4 bytes boundary when my program starts?
我想确保我的变量正确对齐。所以我有以下问题:
当我的程序第一次启动时,即当我的入口点开始时
执行时,此时的堆栈是否与 4 字节边界对齐?
或者这取决于我是否链接到 CRT(我会
猜测 CRT 有自己的入口点,调用我的入口点,
所以这个 CRT 入口点可以调整堆栈对齐,或者是一个
入口点以任何方式添加到我的程序中?)。或者我不应该做
关于堆栈对齐的任何假设并检查
我自己的 esp 值?
当我调用一个函数时,这个函数是否期望堆栈是
对齐,还是取决于调用约定?
在 32 位系统上,传递给程序入口点的 ESP 是 4 字节对齐的。在 64 位系统上,它是 8 字节对齐的。这是由程序 loading/startup 逻辑保证的,它将这样一个对齐的 ESP 传递到您的入口点。
一旦您的程序开始执行,所有函数(库、OS 调用以及您将编码的函数)都希望保留这种对齐方式,并且几乎没有代码会违反它。 (原因之一:未对齐的堆栈充其量意味着未对齐的访问,这会减慢您的程序。)
我想确保我的变量正确对齐。所以我有以下问题:
当我的程序第一次启动时,即当我的入口点开始时 执行时,此时的堆栈是否与 4 字节边界对齐? 或者这取决于我是否链接到 CRT(我会 猜测 CRT 有自己的入口点,调用我的入口点, 所以这个 CRT 入口点可以调整堆栈对齐,或者是一个 入口点以任何方式添加到我的程序中?)。或者我不应该做 关于堆栈对齐的任何假设并检查 我自己的 esp 值?
当我调用一个函数时,这个函数是否期望堆栈是 对齐,还是取决于调用约定?
在 32 位系统上,传递给程序入口点的 ESP 是 4 字节对齐的。在 64 位系统上,它是 8 字节对齐的。这是由程序 loading/startup 逻辑保证的,它将这样一个对齐的 ESP 传递到您的入口点。
一旦您的程序开始执行,所有函数(库、OS 调用以及您将编码的函数)都希望保留这种对齐方式,并且几乎没有代码会违反它。 (原因之一:未对齐的堆栈充其量意味着未对齐的访问,这会减慢您的程序。)