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;
}