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();
但是,如果没有放弃连续存储,则无法解决“真实”问题:如果一个对象被释放,则会在堆中引起一个漏洞,从而导致高度碎片.您只能跟踪被释放的对象并重新使用存储.
总结以上是内存溢出为你收集整理的如何在C中编写缓存友好的多态代码?全部内容,希望文章能够帮你解决如何在C中编写缓存友好的多态代码?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)