c – 什么是“堆栈对齐”?

什么是堆栈对齐?
为什么使用它?
它可以由编译器设置控制吗?

这个问题的细节是从一个问题面临的当试图使用ffmpeg库与msvc,但我真正感兴趣的是什么是“堆栈对齐”的解释。

细节:

>当runnig我的msvc编译的程序链接到avcodec我得到
以下错误:“编译器未对齐堆栈变量。Libavcodec有
被误编译“,其次是avcodec.dll崩溃。
> avcodec.dll没有编译msvc,所以我不能看到里面发生了什么。
>当运行ffmpeg.exe并使用相同的avcodec.dll一切正常。
> ffmpeg.exe没有使用msvc编译,它符合gcc / mingw(与avcodec.dll相同)

谢谢,

变量在记忆中的对齐(短历史)。

在过去的计算机有一个8位数据总线。这意味着,每个时钟周期可以处理8位信息。那是很好的。

然后来了16位电脑。由于向下兼容性和其他问题,保留了8位字节,并引入了16位字。每个字是2字节。并且每个时钟周期可以处理16位信息。但这给了一个小问题。

让我们来看一个内存映射:

+----+
|0000| 
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |

在每个地址有一个字节。其中可以单独访问。
但是字只能在偶地址才能获取。因此,如果我们在0000读取字,我们读取0000和0001处的字节。但是如果我们想读取位置0001处的字,则需要两次读访问。首先是0000,0001,然后是0002,0003,我们只保留0001,0002。

当然这需要一些额外的时间,这是不赞赏。所以这就是为什么他们发明了对齐。因此,我们在字边界存储字变量,在字节边界存储字节变量。

例如,如果我们有一个带有字节字段(B)和字段(W)的结构(和一个非常天真的编译器,我们得到以下结果:

+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+

这不是乐趣。但是当使用字对齐时,我们发现:

+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+

这里存储器牺牲访问速度。

你可以想象,当使用双字(4字节)或四字(8字节)时,这是更重要的。这就是为什么使用大多数现代编译器,您可以选择在编译程序时使用的对齐方式。

http://stackoverflow.com/questions/672461/what-is-stack-alignment

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 什么是“堆栈对齐”?