【问题标题】:Shared memory alignment in C++C++ 中的共享内存对齐
【发布时间】:2016-09-22 10:56:38
【问题描述】:

分配的共享内存是否有任何对齐?如果是,是否适用于所有操作系统?

例如在 boost 中分配共享内存:

boost::interprocess::shared_memory_object* segment =
    new boost::interprocess::shared_memory_object(
        boost::interprocess::create_only,
        "name",
        boost::interprocess::read_write);

segment->truncate(10000);

【问题讨论】:

  • 不,不。在构成当前 C++ 标准的 1400 页中,没有提到任何称为“共享内存”的东西。这是特定于操作系统的资源,因此,共享内存的特定细节是特定于每个操作系统的。
  • 假设通用分配器以基本对齐方式返回内存(即alignof(std::max_align_t),因此它应该适用于“正常”类型)可能是合理的。

标签: c++ boost shared-memory


【解决方案1】:

共享/虚拟内存系统分配和映射内存页面,并按页面大小对齐。查看页面大小列表here。页面大小取决于 CPU 和操作系统。我不知道现代 CPU 使用的页面大小小于 4kB。

在 POSIX 系统上,您可以使用 sysconf(_SC_PAGESIZE) 找出页面大小。在使用大页面的情况下,此调用返回最小的页面大小。

【讨论】:

  • std 中还有一个函数,它获取未对齐的内存并返回一个对齐的指针。它需要额外的 alignment-1 空间。
【解决方案2】:

C++ 本身没有碎内存。有各种扩展。原始的返回页面对齐的块,但您的包装器可能会向它们添加子块分配系统。

如果你有一块内存,你可以在块内找到一个对齐的指针,要么手动弄乱位(不可移植),要么使用std::align。它旨在使从未对齐​​的块中“剥离”对齐的子块变得非常容易。

struct aligned_peeler {
  void* raw=nullptr;
  std::size_t size=0;
  void* operator*( std::size_t align, std::size_t amt ){
    return std::align(align, amt, raw, size);
  }
};

现在可以向aligned_peeler 传递一个块,并且您可以从中请求对齐的块。当空间不足时,它将失败并返回 nullptr。

将其变成真正的免费存储需要大量工作,但我猜boost 至少有一个分配器,可以将共享内存页面作为源提供。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2021-12-19
    • 2021-11-26
    相关资源
    最近更新 更多