gpt4 book ai didi

c++ - 在 C++ 中使用指针列表,(继承还是性能?)

转载 作者:太空狗 更新时间:2023-10-29 23:05:23 24 4
gpt4 key购买 nike

我得到了一些代码来阅读,这些代码对网格进行了一些几何操作。

根据定义,网格数据结构至少应包含以下信息关于点的坐标,边缘连通性和面部信息。

因此,给我的代码具有定义顶点、边和面数据结构的类,分别命名为 Vertex、Edge 和 Face。

但是网格类看起来像这样。

class basemesh
{
public:
/* Methods to operate on the protected data below.*/

protected:
/*! list of edges */
std::list<Edge*> m_edges;

/*! list of vertices */
std::list<Vertex*> m_verts;

/*! list of faces */
std::list<Face*> m_faces;

}

我的问题:为什么网格数据结构存储指针列表而不是相应对象本身的列表。

例如为什么不直接说std::list<Vertex>

我已经看到这个结构被用在其他几个 C++ 代码中

这和类的继承有关系吗?或者有什么事要做关于迭代列表的性能?

顾名思义,这个basemesh类是一个基类,派生出其他专门的网格。

最佳答案

这里没有性能原因。它只是一个所有权共享的例子。请记住这一点作为经验法则:C++ 中的指针用于共享/传递资源的所有权,或通过动态绑定(bind)提供多态行为。

人们谈论性能是因为您避免复制这些东西。等等等等等等。需要复制就复制。它使用指针的唯一原因是作者在复制事物列表时不想复制事物,换句话说,他/她想在两个位置(列表)维护相同的事物):所有权共享,前面说过。

另一方面,请注意该类名为 basemesh .所以这里指针的真正意义可能是处理多态顶点、边等(动态绑定(bind))。

注意:如果性能是这里的重点,我很确定作者会使用紧凑且对齐的 non-cache-miss-prone std::vector而不是 std::list .在这种情况下,使用指针最可能的原因是多态性,而不是性能。与指针、解除引用和遍历链表相关的任何事物的性能总是不如紧凑数据,这正是 std::vector<Vertex>是,例如。 同样,如果指针的使用不是为了多态性,而是为了所有权相关的事情,而不是性能。

其他说明:复制 是的,您正在复制。但请注意复制的内容和方式。除了非常罕见的实现之外,顶点是成对的 float /整数。 复制 64 位 float 与复制 32/64 位指针没有任何好处
另请注意,除非您没有那么幸运,您正在复制存储在同一缓存行或几乎缓存中的内容。

现在关于优化的一个好的规则是:尝试优化内存访问,而不是 CPU cicles。我推荐这个主题:What is "cache-friendly" code? ,这是一个实际案例:Why are elementwise additions much faster in separate loops than in a combined loop? .最后,this thread包含有关使用现代编译器进行优化的重要说明。

关于c++ - 在 C++ 中使用指针列表,(继承还是性能?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com