c++ - 如何在 C++ 中编写缓存友好的多态代码?

标签 c++ caching polymorphism

我正在写一段对性能要求很高的代码,需要用多态的方式处理大量的对象。假设我有一个 A 类和一个派生自 A 的 B 类。我现在可以像这样创建 B:s 的 vector

vector<A*> a(n);
for(int i = 0; i < n; i++)
  a[i] = new B();

但是如果 n 很大(在我的例子中是 10^6 或更多),这将需要对 new 进行非常多的调用,而且 n 个对象可能会分散在我的主内存中,从而导致缓存性能非常差.处理这种情况的正确方法是什么?我正在考虑做类似下面的事情,将所有对象放在一个连续的内存区域中。

B* b = new B[n];
vector<A*> a(n);
for(int i = 0; i < n; i++)
  a[i] = b + i;

但一个问题是如果 b 不再可用(但我们仍然有 a),如何释放由 new B[n] 分配的内存。我刚刚了解到尝试

delete[] a[0];

这不是一个好主意...

最佳答案

如果您确定这些只会是 B 类型的对象,为什么不使用并行 vector :

vector<B> storage(n);
vector<A*> pointers(n);
for(int i = 0; i < n; i++)
   pointers[i] = &storage[i];

关于c++ - 如何在 C++ 中编写缓存友好的多态代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261027/

相关文章:

c++ - Directshow Push Source Filter,同步音视频流

c++ - wxwidgets//g++编译错误: no matching function for call to 'operator new(..'

c++ - 如何调用一个方法,该方法需要一个子类对象,子类对象由指向其父类(super class)的指针引用?

java - 创建对象和多态性

java - 创建不可变通用对象的 HashMap

c++ - 具有模板化派生类的基类纯虚函数

c++ - 为什么 std::unordered_map::count 上没有 `noexcept` 说明符?

c++ - "xvalue has identity",为什么我不能计算它的地址

caching - EJB weblogic.ejb20.cache.CacheFullException

multithreading - 锁定 HttpRuntime.Cache 以进行延迟加载