В настоящее время я изучаю несколько способов передачи экземпляра сложного объекта CGAL другому процессу. В другом посте я спрашивал о пользовательских аллокаторах, но другой метод — потоки строк. (к сведению, общая память не подходит)
Текущий CGAL::Nef_polyhedron_3 обеспечивает iostreaming:
// In main process
Nef_polyhedron_3 NP3;
stringstream ss;
ss << NP3;
sendToOtherProcess(ss.str());
// In separate process
stringstream ss(stringFromOtherProcess);
Nef_polyhedron_3 NP3;
ss >> NP3;
Теперь потоковая передача на выходе медленная, а потоковая передача на входе в четыре раза медленнее.
Причина (я предполагаю) в том, что это все кастинг. Класс, который это делает, можно найти здесь: https://github.ugent.be/divhaere/cgal/blob/master/include/CGAL/Nef_3/SNC_io_parser.h
Возьмем только фрагмент одного из членов класса (ln 1481):
in >> hx >> hy >> hz >> hw;
vh->point() = Point_3(hx,hy,hz,hw);
Выполнение этого для многих тысяч точек занимает некоторое время. На стороне вывода это быстрее (не уверен, почему именно)
Могу ли я каким-либо образом предоставить какой-то двоичный поток, который не будет выполнять все приведения? Я знаю, что можно писать в любой поток в двоичном виде с помощью read(), write(), но я не могу (легко) изменить CGAL SNC_io_parser.h. Я предполагаю, что в идеале я хотел бы иметь возможность предоставить поток, который, когда его просят передать (в любом случае), он делал это в двоичном виде.
Любая помощь принята с благодарностью.
Маркос