C++,如何使用 mmap() 确保内存对齐?
C++, How to Ensure Aligned Memory Using mmap()?
我目前正在使用 mmap 分配内存,如下所示:
void *void_new_block = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
现在我想提高 64 位 cpus 的性能,因此我需要我的块驻留在地址之间,这些地址是 8 的乘法为此我需要两件事:
确保大小是 8 的倍数(我已经四舍五入了)
确保mmap从8倍的地址开始分配
我该如何解决 2?我听说一些特殊的标志可能会有帮助?
一些笔记,我的OS:
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
g++ 版本:
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
mmap always allocates entire pages.
If addr is NULL, then the kernel chooses the (page-aligned) address at which to create the mapping [...] If addr is not NULL, then [...] on Linux, the kernel will pick a nearby page boundary
(在 Linux 以外的系统上,它仍然需要选择一个页面边界,但它可能不在附近)
在 x86 或 x86_64 上,页面是 4096 字节,所以你没问题。很难想象页面小于 8 字节的 CPU。
我目前正在使用 mmap 分配内存,如下所示:
void *void_new_block = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
现在我想提高 64 位 cpus 的性能,因此我需要我的块驻留在地址之间,这些地址是 8 的乘法为此我需要两件事:
确保大小是 8 的倍数(我已经四舍五入了)
确保mmap从8倍的地址开始分配
我该如何解决 2?我听说一些特殊的标志可能会有帮助?
一些笔记,我的OS:
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
g++ 版本:
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
mmap always allocates entire pages.
If addr is NULL, then the kernel chooses the (page-aligned) address at which to create the mapping [...] If addr is not NULL, then [...] on Linux, the kernel will pick a nearby page boundary
(在 Linux 以外的系统上,它仍然需要选择一个页面边界,但它可能不在附近)
在 x86 或 x86_64 上,页面是 4096 字节,所以你没问题。很难想象页面小于 8 字节的 CPU。