加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:42:19 所属栏目:百科 来源:网络整理
导读:我正在编写一个对性能要求很高的代码,我需要以多态方式处理大量的对象.假设我有一个A类和一个派生自A的B类.现在我可以创建一个像这样的B:的向量 vectorA* a(n);for(int i = 0; i n; i++) a[i] = new B(); 但是如果n大(在我的情况下为10 ^ 6或更多),这将需要
我正在编写一个对性能要求很高的代码,我需要以多态方式处理大量的对象.假设我有一个A类和一个派生自A的B类.现在我可以创建一个像这样的B:的向量
vector<A*> a(n);
for(int i = 0; i < n; i++)
  a[i] = new B();

但是如果n大(在我的情况下为10 ^ 6或更多),这将需要非常多的对新的调用,而且n个对象可能会遍布我的主内存,导致非常差的缓存性能.处理这种情况的正确方法是什么?我正在考虑做一些像下面这样的事情,让所有的对象都在一个连续的内存区域.

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

但是一个问题是如果b不再可用(但是我们还有一个),如何释放新的B [n]分配的内存.我刚刚学到了尝试

delete[] a[0];

不是一个好主意…

解决方法

您可以使用贴片新建在特定内存位置构建一个对象:
vector<A*> a(n);
for(int i = 0; i < n; i++)
  a[i] = new(storage + i*object_size) B();
  // and invoke the destructor manually to release the object (assuming A has a virtual destructor!)
  a[i]->~A();

但是,如果没有放弃连续存储,则无法解决“真实”问题:如果一个对象被释放,则会在堆中引起一个漏洞,从而导致高度碎片.您只能跟踪被释放的对象并重新使用存储.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读