2016-09-22 83 views
2

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

例如,分配共享存储器在升压:

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

segment->truncate(10000); 
+3

不,没有。在构成当前C++标准的1400页中,没有提及任何称为“共享内存”的内容。这是特定于操作系统的资源,因此,共享内存的特定细节特定于每个操作系统。 –

+2

这可能是合理的,假设像这样的通用分配器在基本对齐时返回内存(即'alignof(std :: max_align_t)',所以它应该适用于“正常”类型。) –

回答

1

共享/虚拟存储器系统分配和映射存储器页面,并且由页面大小对准。请参阅页面大小列表here。页面大小是CPU和操作系统特定的。我不知道使用小于4kB的页面大小的现代CPU。

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

+0

还有一个函数标准输入未对齐的内存并返回一个对齐的指针。它需要额外的空间1。 – Yakk

-1

对齐取决于您的计算机体系结构定义的页面大小。我会说,共享内存然后也与页面大小对齐。

0

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至少有一个分配器可以共享内存页面作为源。