boost 文件映射进程间通信 共享数据结构中含有非POD类型,如vector , 也可用于对象序列化

struct Msg 中含有  mystruct 的 vector

struct mystruct 
{
	double x;
	double y;
	double z;
};

namespace bipc = ::boost::interprocess;
typedef bipc::managed_mapped_file managed_mapped_file_t;
typedef bipc::managed_mapped_file::segment_manager mapped_segment_manager_t;

typedef bipc::node_allocator<mystruct, mapped_segment_manager_t> vec_allocator_t;
typedef boost::container::vector<mystruct, vec_allocator_t> vector_t;

struct Msg
{
	Msg(const vec_allocator_t &vec_alloc) : score(vec_alloc){}
	int id;
	int age;
	char name[128];
	vector_t score;
};



int main()
{
	clock_t startTime, endTime;
	startTime = clock(); 

	managed_mapped_file_t obj_mapped_file(bipc::open_or_create, "msg_map.mmap", 72001000);
	

	Msg * p_msg = obj_mapped_file.find_or_construct<Msg>("msg_map")(obj_mapped_file.get_segment_manager());
	if (NULL == p_msg)
	{
		std::cerr << "construct msg failed" << std::endl;
		return -1;
	}


	std::cout<<"capacity:"<<p_msg->score.capacity()<<std::endl;

	// 给vector 申请 3000000个空间
	p_msg->score.reserve(3000000);    // 必须提前分配 vector 空间, 这样managed_mapped_file_t obj_mapped_file(bipc::open_or_create, "msg_map.mmap", 72001000);文件分配大小才能具体算出大小

	std::cout << "msg id:" << p_msg->id << std::endl;
	std::cout << "msg name:" << p_msg->name << std::endl;
	std::cout << "msg age:" << p_msg->age << std::endl;

	int nCount = p_msg->score.size();
	std::cout << "score size:" << nCount << std::endl;
	if (nCount>0)
	{	
		double dTotalX = 0;
		double dTotalY = 0;
		double dTotalZ = 0;
		for (int n = 0; n < nCount; ++n)
		{
			dTotalX += p_msg->score[n].x;
			dTotalY += p_msg->score[n].y;
			dTotalZ += p_msg->score[n].z;
		}

		std::cout << "total socre X:" << dTotalX << "  Y:" << dTotalY <<  "  Z:" << dTotalZ<<std::endl;
	}
	
	p_msg->id = p_msg->id + 1;
	strcpy(p_msg->name, "hello world");
	p_msg->age = p_msg->age + 1;

	for (int i = 0; i < 3000000; ++i)
	{
		mystruct t1;
		t1.x = 1.1;
		t1.y = 1.0;
		t1.z = 1.0;
		p_msg->score.push_back(t1);
	}

	//obj_mapped_file.grow("msg_map.mmap", 10240 * 10240);
	std::cout << "SIZE:---" <<sizeof(Msg) << std::endl;

	endTime = clock();
	std::cout << "Runtime: " << (double)(endTime - startTime) * 1000.0 / CLOCKS_PER_SEC << " ms!" << std::endl;
	return 0;
}

 

 

 

多个vector

 

struct mystruct 
{
	double x;
	double y;
	double z;
};



struct mystruct1
{
	double x;
	double y;
	double z;
};

namespace bipc = ::boost::interprocess;
typedef bipc::managed_mapped_file managed_mapped_file_t;
typedef bipc::managed_mapped_file::segment_manager mapped_segment_manager_t;

typedef bipc::node_allocator<mystruct, mapped_segment_manager_t> vec_allocator_t;
typedef boost::container::vector<mystruct, vec_allocator_t> vector_t;


typedef bipc::node_allocator<mystruct1, mapped_segment_manager_t> vec_allocator_t1;
typedef boost::container::vector<mystruct1, vec_allocator_t1> vector_t1;


struct Msg
{
	Msg(const vec_allocator_t &vec_alloc, const vec_allocator_t1 &vec_alloc1) : score(vec_alloc), score1(vec_alloc1){}
	//Msg(const vec_allocator_t1 &vec_alloc1) : score1(vec_alloc1){}
	int id;
	int age;
	char name[128];
	vector_t score;
	vector_t1 score1;
};



int main()
{
	//testMethod();

	clock_t startTime, endTime;
	startTime = clock(); 

	managed_mapped_file_t obj_mapped_file(bipc::open_or_create, "msg_map.mmap", 72001000);
	

	Msg * p_msg = obj_mapped_file.find_or_construct<Msg>("msg_map")(obj_mapped_file.get_segment_manager(), obj_mapped_file.get_segment_manager());
	if (NULL == p_msg)
	{
		std::cerr << "construct msg failed" << std::endl;
		return -1;
	}


	std::cout<<"capacity:"<<p_msg->score.capacity()<<std::endl;

	// 给vector 申请 3000000个空间
	p_msg->score.reserve(300000);    // 必须提前分配 vector 空间, 这样managed_mapped_file_t obj_mapped_file(bipc::open_or_create, "msg_map.mmap", 72001000);文件分配大小才能具体算出大小

	std::cout << "msg id:" << p_msg->id << std::endl;
	std::cout << "msg name:" << p_msg->name << std::endl;
	std::cout << "msg age:" << p_msg->age << std::endl;

	int nCount = p_msg->score.size();
	std::cout << "score size:" << nCount << std::endl;
	std::cout << "score1 size:" << p_msg->score1.size() << std::endl;
	if (nCount>0)
	{	
		/*double dTotalX = 0;
		double dTotalY = 0;
		double dTotalZ = 0;*/
		double C[9] = { 1.1, 0.89, 19.25, 6.589, 3.56, 159.26, 0, 9.2, 8 };  //mRQX
		for (int n = 0; n < nCount; ++n)
		{
			//dTotalX += p_msg->score[n].x;
			//dTotalY += p_msg->score[n].y;
			//dTotalZ += p_msg->score[n].z;

			p_msg->score[n].x = p_msg->score[n].x * C[0] + p_msg->score[n].y * C[1] + p_msg->score[n].z * C[2];
			p_msg->score[n].y = p_msg->score[n].x * C[3] + p_msg->score[n].y * C[4] + p_msg->score[n].z * C[5];
			p_msg->score[n].z = p_msg->score[n].x * C[6] + p_msg->score[n].y * C[7] + p_msg->score[n].z * C[8];
		}


		endTime = clock();
		std::cout << "hard disk Runtime: " << (double)(endTime - startTime) * 1000.0 / CLOCKS_PER_SEC << " ms!" << std::endl;
	}

	p_msg->id = p_msg->id + 1;
	strcpy(p_msg->name, "hello world");
	p_msg->age = p_msg->age + 1;

	for (int i = 0; i < 300000; ++i)
	{
		mystruct t1;
		t1.x = 1.1;
		t1.y = 1.0;
		t1.z = 1.0;
		p_msg->score.push_back(t1);
	}

	for (int i = 0; i < 310000; ++i)
	{
		mystruct1 t1;
		t1.x = 1.1;
		t1.y = 1.0;
		t1.z = 1.0;
		p_msg->score1.push_back(t1);
	}

	//obj_mapped_file.grow("msg_map.mmap", 10240 * 10240);
	std::cout << "SIZE:---" <<sizeof(Msg) << std::endl;

	clock_t endTime1 = clock();
	std::cout << "Runtime: " << (double)(endTime1 - endTime) * 1000.0 / CLOCKS_PER_SEC << " ms!" << std::endl;
	return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值