2016-09-22 84 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至少有一個分配器可以共享內存頁面作爲源。