【发布时间】:2016-02-26 02:00:02
【问题描述】:
我正在构建一个建模软件我有几个关于如何获得最佳性能的问题?
1) 我应该使用 std::vector<class> 还是 std::vector<class*> ?
我的课相当复杂/很大,我认为使用第二个选项更好,因为 std::vector 尝试连续分配内存并且可能没有连续的内存块来存储一百万class,但是当我只需存储指针,class 不必连续存储,只需存储指针,并且计算机可能有空间来执行此操作。这个推理正确吗?
2) 正如我所说,我将拥有数百万个class,(为了进行适当的模拟,我需要> 十亿个class)在这里使用继承是否明智?
对于我的模拟,有多种不同的类型继承自同一个基类,
class A - class B
- class C
- class D
我是否应该避免继承,因为我一直听说使用继承会降低性能?
3) 另外,我如何将所有这些不同的类存储在 std::vector 中?
std::vector<base_class * > 或 std::vector<base_class> 可以存储类 B、类 C、类 D,它们都继承自基类吗?
4) 在之前版本的程序中,我通过让不同的进程处理 std::vector 的不同部分来使用多线程,有没有更好的线程处理方法?
5) 我应该使用智能指针吗?既然我有这么多对象,它们会降低性能吗?
我正处于计划阶段,非常感谢任何帮助。
【问题讨论】:
-
不要回避抽象。测量。
-
您可以考虑std::deque,它也具有恒定的访问时间,但将数据分配在块中,然后永远不会重新分配。
-
@user3159253 我将研究 std::deque ,但快速的问题是否允许我像 std::vector 一样快速地遍历项目?
-
如果你希望有一个混合类型的容器,那么指针是不可避免的,可能是unique_ptr。完全独立地并行处理不同的数据块(想想分片)是一个聪明的主意。关于双端队列的性能:是的,访问时间是 O(1),只比向量的稍差(它必须首先计算所需块的位置)。是的,进行性能测试。
-
继承的性能损失可能完全不同。如果你经常使用
virtual方法,那么,是的,与非虚拟情况相比,它会降低性能。另一方面,内联可以在更高的优化级别上提供很大帮助。但是,再次,通过测试检查每个想法,取决于编译器和目标平台,结果可能完全不同
标签: c++ multithreading c++11 inheritance vector