gpt4 book ai didi

c - 如果将已分配的内存块分割成更小的 block ,我还需要担心内存对齐吗?

转载 作者:行者123 更新时间:2023-11-30 15:11:19 26 4
gpt4 key购买 nike

我正在 x86 和/或 64 位 Windows 平台上用 C 编写程序。我使用 VirtualAlloc 来分配一大块内存。现在,在我的程序中,我将在运行时使用我自己编写的内存分配器在程序的各个部分之间分配内存空间。将打包到该内存块中的数据包括位图、wav 文件等。Windows 常量 MEMORY_ALLOCATION_ALIGNMENT 在 32 位版本的操作系统上定义为 8,在 64 位版本的操作系统上定义为 16版本。我的问题是,如果我已经从 VirtualAlloc 分配了连续(已对齐) block ,我是否仍然关心沿 8 或 16 字节边界对齐此数据?如果需要的话,将填充字节添加到我的分配器中是很简单的,但我不知道我是否真的需要这样做。

为了清楚起见,假设我有

void* chunk = VirtualAlloc(NULL, 33554432, MEM_RESEVE | MEM_COMMIT, PAGE_READWRITE);

所以现在我有 32MB 内存,操作系统已经为我对齐了。如果我自己将 32MB 内存块 segmentation 为不同的数据 block ,这些 segmentation 的内存区域是否也应该在 8 或 16 字节边界上对齐?

最佳答案

该内存块的 block 是否需要特定的对齐方式取决于代码如何访问它们。如果您不知道代码如何访问此内存,则应通过将偏移量四舍五入到 MEMORY_ALLOCATION_ALIGNMENT 的倍数来对齐 block 。否则,如果访问 block 的代码做出无效假设并使用一些命令特定对齐的指令访问未对齐的内存,则可能会调用未定义的行为。

在 x86 架构上,通过通用设置,可以对未对齐的地址进行字节、字、双字和四字访问,但 MMX 和 AVX 指令确实需要 16 字节对齐,如果在未对齐的地址上进行,则会生成异常。

关于c - 如果将已分配的内存块分割成更小的 block ,我还需要担心内存对齐吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35712229/

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