-->

分享CGAL在C进程之间的几何++(Share CGAL's geometry betwee

2019-09-23 05:40发布

我在寻找送CGAL的程序(C ++)之间的几何形状的最快方式。 让我们假设,我们有2个进程 - A和B进程A生成的几何形状和过程B被显示它。 我想将它们连接最快awailable方式。 几何形状是CGALs多面体型的。

我知道我可以使用共享内存,但后来我有一些问题:

  1. 当我想从程序的副本几何共享内存,我可以使用/从OFF格式的流多面体,但我不感兴趣,因为转换成这种格式是我的目的太慢。
  2. 我可以创建共享内存,并使用“放置新的”创建我的共享内存对象和克服流和转换的开销,但后来我有内部多面体功能的内存分配没有进一步的控制。 (例如添加具有Polyhedron_incremental_builder_3新的顶点时,无法在指定正好在存储器它应放置 - I只需调用B.add_vertex(点(0,0,0));和存储器分配在该方法中处理的内部)

有没有办法在一个特定的地方共享内存中创建对象,并保证,它和它的动态结构,将“活”在这个内存?

或者,也许有两个过程之间共享的动态数据(即半边结构),另一种快速?

Answer 1:

我具有由内部多面体功能的存储器分配的没有进一步的控制。

事实上,你确实有控制。

参考手册说:

类Polygon_2实现多边形。 该Polygon_2由traits类和容器类参数。 后者可以是满足对STL容器的要求的任何类。 它默认载体类。

除了使用放置新的多边形本身,你需要一个容器,可以在共享内存放。 你可以尝试使用boost::interprocess::vector ,或推出自己的容器类。

如果您使用boost::interprocess::vector ,你需要创建一个包装类,因为不像一个STL容器,它的构造函数需要一个allocator 对象Polygon_2将不能正确地构建它。 所以,你必须从某种全局变量让你的共享内存分配器对象。 例如:

using namespace boost::interprocess;
typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;
ShmemAllocator some_global_shmem_allocator;
template <typename T>
class my_shared_memory_vector : vector<T, ShmemAllocator>
{
public:
  my_shared_memory_vector() : vector(some_global_shmem_allocator) {}
};

免责声明:我没有真正做过任何的这个自己。 如果您的计算机捕获的火焰为这样的结果,你的房子被烧毁,不要抱着我负责。 这将是明智的,仔细检查(通过看GCAL源)任何内存Polygon_2分配实际上是由容器管理。

编辑 :我有误解的问题,它会询问关于多面体,不是多边形。 下面参见注释。



Answer 2:

当然,最明显的事情将要使用的线程,而不是过程。 这将没有努力解决整个问题都没有。

除此之外,短黑客你的编译器的运行时库替换它的内存管理,你实际上可以覆盖“运营商新的”一类,和/或可以提供全球性的。 这将让你换成您自己的内存分配代码的“新”的呼叫。 你可以使用你做CGAL通话前设置和重置后一个全球性的标志,告诉你要使用什么内存堆内存分配器(你会明显不得不作出某种形式的堆管理的共享内存)。

重写新的运营商将只对“新”的呼叫,当然啦。 凡是通过的malloc分配得到如()或某些系统调用不会去通过您的代码。 你可以尝试提供自己的malloc()和free()的调用(包含在目标文件的功能优于功能从库),看看是否能正常工作,但这些很可能将不得不应对操作系统的内存管理因为你失去的库函数。 这肯定将是凌乱。



文章来源: Share CGAL's geometry between processes in C++