Здравствуйте, Atminav, Вы писали:
A>Нужно выделять память, не забывать освобождать ее, да еще следить, чтобы указатель не был 0... Кроме того, указатели — это лишний уровень косвенности, лишнии операции при обращении к объекту.
По поводу косвенной адресации не так уж она и долго происходит
Что мешает использовать указатели !=0 и без выделения памяти?
MyType A[N];
MyType* idx[N];
for(int i=0;i<N;i++) idx[i]=A+i;
A>Вообще, не хочется без лишней необходимости пользоваться new/delete. Так что указатели, даже смарт-указатели, я не рассматриваю.
не хочется н вызывай. Организуй выделения элементов страницами. На каждой странице по N элементов сразу выделяется.
enum { PageShift=12, PageLimit=1<<PageShift, PageMask=PageLimit-1 };
int N=mongo();
MyType** pages=makeSomePages(N,PageLimit);
...
vector<MyType*> idx;
for(int i=0;i<N;i++) idx.push_back(pages[i>>12]+(i&PageMask));
Если хочется можеш им и конструкторы вызывать переопределив void* operator new(void* where,size_t size);
А в сбалансированном дереве хранить указатели или номера элементов и работать уже с ними. Указатель всего одно машинное слово по сравнению со структурой которая может занимать килобайты.