gpt4 book ai didi

c++ - 什么是 "stack alignment"?

转载 作者:太空宇宙 更新时间:2023-11-04 12:49:47 24 4
gpt4 key购买 nike

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

这个问题的细节取自尝试将 ffmpeg 库与 msvc 一起使用时遇到的问题,但是我真正感兴趣的是对什么是“堆栈对齐”的解释。

详细信息:

  • 当运行链接到 avcodec 的 msvc 编译程序时,我得到了以下错误:“编译器没有对齐堆栈变量。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 字节)时,这一点更为重要。这就是为什么对于大多数现代编译器,您可以在编译程序时选择要使用的对齐方式。

关于c++ - 什么是 "stack alignment"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49582585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com