我正在寻找在进程(C ++)之间发送CGAL几何的最快方法。让我们假设,我们有2个进程--A和B.进程A生成几何,进程B正在显示它。我想以最快的速度连接它们。几何图形是CGALs多面体类型。
我知道我可以使用共享内存,但后来我遇到了一些问题:
有没有办法在共享内存中的特定位置创建对象并确保它及其动态结构将“存在”此内存中?
或许还有另一种快速的方式在两个进程之间共享动态数据(即Halfedge结构)?
答案 0 :(得分:1)
内部多面体无法进一步控制内存分配 功能
你确实有控制权。
参考手册说:
Polygon_2类实现了多边形。 Polygon_2由特征参数化 class和容器类。后者可以是任何满足的类 STL容器的要求。它默认为矢量 类。
除了使用多边形本身的placement new之外,还需要一个可以放在共享内存中的容器。您可以尝试使用boost::interprocess::vector
,或者滚动自己的容器类。
如果使用boost::interprocess::vector
,则需要为其创建包装类,因为与STL容器不同,其构造函数需要分配器对象。 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
分配实际上是由容器管理的。
编辑:我误解了这个问题,它询问了Polyhedra,而不是Polygons。见下面的评论。
答案 1 :(得分:0)
当然,最明显的事情是使用线程而不是进程。这将毫不费力地解决整个问题。
除此之外,如果没有黑客攻击编译器的运行时库来替换它的内存管理,你实际上可以覆盖类的“operator new”,和/或你可以提供一个全局的。这将允许您使用自己的内存分配代码替换“新”调用。您可以使用在进行CGAL调用之前设置的全局标志,然后重置,告诉内存分配器您要使用的内存堆(您显然必须为共享内存进行某种形式的堆管理)。
当然,覆盖新运算符仅适用于“新”调用。任何被分配的东西,例如通过malloc()或某些系统调用不会通过你的代码。您可以尝试提供自己的malloc()和free()调用(目标文件中包含的函数优先于库中的函数)以查看这是否可行,但这些可能必须处理操作系统以进行内存管理因为你松开了库函数。这肯定会很混乱。