2017-06-01 50 views
1

我有两个程序。关于boost的一个难题:: interprocess :: managed_shared_memory-> size

#include <iostream> 

#include <boost/interprocess/managed_shared_memory.hpp> 


int main(int argc, char const* argv[]) 
{ 
    boost::interprocess::shared_memory_object::remove("High"); 
    try { 
     boost::interprocess::managed_shared_memory managed_shm(
       boost::interprocess::create_only, 
       "High", 
       256); 
     std::cout << "success" << std::endl; 
    } 
    catch (boost::interprocess::interprocess_exception &ex) { 
     std::cout << ex.what() << std::endl; 
    } 
    return 0; 
} 

它打印输出 “的boost :: interprocess_exception :: library_error”

但改变256到512,它打印 “成功”:

#include <iostream> 

#include <boost/interprocess/managed_shared_memory.hpp> 


int main(int argc, char const* argv[]) 
{ 
    boost::interprocess::shared_memory_object::remove("High"); 
    try { 
     boost::interprocess::managed_shared_memory managed_shm(
       boost::interprocess::create_only, 
       "High", 
       512); 
     std::cout << "success" << std::endl; 
    } 
    catch (boost::interprocess::interprocess_exception &ex) { 
     std::cout << ex.what() << std::endl; 
    } 
    return 0; 
} 

是什么256之间的区别512?

+1

你能提供有关平台的更多信息/编译器/增强版本?我刚刚在Visual Studio 2010上用boost 1.55和boost 1.62运行了代码,输出结果为256和512共享内存大小的“成功”。 – pschill

+0

@pschill可能在32位目标 – sehe

+1

不,我尝试了32和64目标。但现在我重新尝试了其他内存大小,并在64位它的大小为256,但与255大小崩溃:) – pschill

回答

3

256和512之间的差异是256

256字节为您的系统(可能的是,任何64位目标)上的段管理器控制块太小。

开销可能让你感到意外,但它有一定意义,因为涉及“堆管理”(在Boost进程中它被称为段管理)。

Bad alloc is thrown参见:

有相当大的初始开销,耗时320个字节出了什么事了。

(这也表现出不同的分配方案的图/数据结构)

如果你想有一个原始的共享内存对象,不分段管理,使用shared_memory_object

+0

作为参考,这是GCC 5.x,升压1.64,64位/ cc @pschill – sehe

相关问题