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 的乘法为此我需要两件事:

  1. 确保大小是 8 的倍数(我已经四舍五入了)

  2. 确保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。