Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免在共享库之间传递数据的开销_C++_Qt - Fatal编程技术网

C++ 避免在共享库之间传递数据的开销

C++ 避免在共享库之间传递数据的开销,c++,qt,C++,Qt,在第一个共享库中,三维坐标数据以点结构存储: 结构点{ 浮点x{0},y{0},z{0}; }; std::vector*m_点; 在第二个共享库中,3D坐标的数据存储在PointContainer类中 类PointContainer:公共QObject { Q_对象 //这是一门复杂的课程。。。 公众: QVector3D m_coord; } QVector*m_点; 为了将数据从第二个共享库传递到第一个共享库,我使用了一个循环: std::矢量数据点的数量; //在第一个共享库所需的结构中

在第一个共享库中,三维坐标数据以点结构存储:

结构点{ 浮点x{0},y{0},z{0}; }; std::vector*m_点; 在第二个共享库中,3D坐标的数据存储在PointContainer类中

类PointContainer:公共QObject { Q_对象 //这是一门复杂的课程。。。 公众: QVector3D m_coord; } QVector*m_点; 为了将数据从第二个共享库传递到第一个共享库,我使用了一个循环:

std::矢量数据点的数量; //在第一个共享库所需的结构中准备数据 对于尺寸_ti=0;i<点数++我{ 浮动x=m_点->ati.m_坐标.x; 浮动y=m_点->ati.m_坐标.y; 浮动z=m_点->ati.m_坐标.z; 点={}; 点x=x; 点y=y; 点z=z; 数据[i]=点; } //现在将数据传递到第一个共享库
_点的数量可能很大,上面的循环在计算上可能很昂贵。有没有办法避免上述循环?我试图在共享库中以相同的结构存储数据,但这需要对代码进行彻底的修改。不确定是否有其他选项,只需询问即可。

此代码将更干净、更快一点:

std::vector<Point> data(number_of_points);
// Prepare the data in the structure needed by the 1st shared library
for (size_t i = 0; i < number_of_points; ++i) {
    const auto& source = (*m_points)[i].m_coord;
    data[i] = {source.x(), source.y(), source.z()};
}
// Now pass data to the 1st shared library

如果您的点数至少为数千万,您可以使用OpenMP或Intel TBB的并行_来加速此循环。

那么,PointContainer继承自QObject,但每个实例只管理一个QVector3D?这似乎太过分了。请注意,很少需要指向容器的指针。如果您需要将容器传递给库中的函数或不传递,请使用引用。@G.M.对。我可能会删除继承问题,考虑QVoice支持标准C++迭代,我建议您先使用一个合适的转换。不要在函数中使用通常的边界检查,并进行简单的内联初始化,编译器可能会将其优化为任何点对象;。。。无法复制QObject子类,因此不能将它们作为QVector中的值。如果你真的想要有一个指针向量,那么为每个点分配一个单独的堆似乎。。。不好的。