c++ - 将内存池与需要对齐内存的 cpu 一起使用是个好主意吗?

标签 c++ memory-management linux-kernel cpu-architecture

CPU and Data alignment 在这个问题中,Yann Ramin 表示,某些 cpu(ARM 或 Intel SSE 指令)需要对齐内存,并且在执行未对齐访问(或抛出异常)时具有未定义的操作。如果我使用的内存池不能处理这种情况,会让我的应用程序变得更糟吗?

最佳答案

使用未对齐的内存几乎总是一个坏主意,不仅是在明确不允许的情况下。即使它不会导致错误,如果内存访问跨越缓存行边界以及在其他情况下(请参阅 Tony D 的评论),它也会比不跨越缓存行边界时慢。只需使用返回对齐地址的内存池即可。

您可以通过使用 new 分配大块字节并将其分解为给定数量的 4、8、16、... 字节 block 并返回最小的字节 block 来创建一个简单的对齐内存池合身。您可以使用位图来跟踪分配了哪些 block 。我应该说这是低效的。我认为这更多的是为了乐趣/学习而不是生产,或者您只需使用 new 。编写自己的分配器并不容易,您可以查看 malloc 的实现来了解我的意思。这是速度、空间效率和碎片之间的困难平衡。

关于c++ - 将内存池与需要对齐内存的 cpu 一起使用是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24926124/

相关文章:

c++ - 在双菱形中到达远处基类的字段或方法的方法是什么?

java - 确定 PermGen 空间中单个 Java 类定义的大小?

qt - 非 QObject 派生类 "always"应该放在堆栈上吗?

linux - 处于 "D"状态(或 TASK_UNINTERRUPTIBLE)的进程的信号会发生什么?

linux - Linux 是否为单独的 mmap() 调用携带数据结构/抽象?

C++ 无法引用 map 的键

c++ - 为什么链表重新排序失败?

C++ 模板实现文件扩展名约定?

c++ - C++ 对象创建时的内存分配

linux - 每次我对 linux 内核做一点改动时,我是否应该安装 modules_install