Я пишу фрагмент кода с высокими требованиями к производительности, когда мне нужно обрабатывать большое количество объектов полиморфным способом. Пусть говорят, что у меня есть класс A и класс B, который получен из A. Теперь я мог бы создать вектор B: s, подобный этому
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 [n], если b больше не доступно (но у нас все еще есть a). Я только что узнал, что попытка
delete[] a[0];
не очень хорошая идея...