Привет ) давольно простой вопрос
есть к примеру
class a { } //хочу сделать массив ссылок на объекты типа a* myArray; //делаю так myArray = (a*)malloc(sizeof(a*)*10); //в идеале хочу получить массив из 10 ссылок и использовать его типа a*obj = new a(); myArray[0] = &a; //ну и где в недрах это дело юзать a*obj = myArray[0];
как я понимаю что должно произойти
(a*)malloc(sizeof(a*)*10); выделит память под 10 референсов
myArray[0] = &a; запомнит под индексом 0 референс на объект
myArray[1] = &a1; запомнит под индексом 1 референс на объект a1 <- да кстати верно будет обратиться к 1 индексу или к 1*sizeof(a*) ?
собственно как это реализовать ?
ЗЫ: причины - протестировав код ( на Objective-C не обращаем внимание ( вставлено только для просчета времени исполнения )
NSTimeInterval d = [[NSDate date] timeIntervalSince1970]; class someB { public: uint id; }; typedef struct { someB*someC; uint sizeAlloced; }someA; someA*someD; uint sizeAlloced; uint testNum = 10000; uint sizeToAlloc = 10; sizeAlloced = 10; someD = (someA*)malloc(sizeof(someA)*10); for (int i = 0; i < testNum;i++) { if (i+1>=sizeAlloced) { sizeAlloced+=sizeToAlloc; someD = (someA*)realloc(someD,sizeof(someA)*sizeAlloced); } someD[i].someC = (someB*)malloc(sizeof(someB)*10); someD[i].sizeAlloced = 10; for (int f = 0; f < testNum;f++) { if (f+1>=someD[i].sizeAlloced) { someD[i].sizeAlloced+=sizeToAlloc; someD[i].someC = (someB*)realloc(someD[i].someC,sizeof(someB)*someD[i].sizeAlloced); } someD[i].someC[f].id = i*f; } } NSTimeInterval ed = [[NSDate date] timeIntervalSince1970]; NSLog(@"%f",(ed-d)); d = [[NSDate date] timeIntervalSince1970]; typedef struct { vector<someB*> someCV; uint sizeAlloced; }someAV; vector<someAV*> someDV; for (int i = 0; i < testNum;i++) { someAV* s = new someAV(); someDV.push_back(s); for (int f = 0; f < testNum;f++) { someB*b = new someB(); s->someCV.push_back(b); b->id = i*f; } } ed = [[NSDate date] timeIntervalSince1970]; NSLog(@"%f",(ed-d));
я получил разницу в 7 раз
1000+ мс против 7000+ мс
Возможные причины:
1. Отладочный версия. Инлайн-подставновки в дебаг-сборке не производятся.
2. Не знаю как ты совместил С++ и objectiveC, они сильно отличаются по внутренней механике. В objectiveC все функции виртуальные, а это существенные дополнительные затраты.
Zab
То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?
и вобще вопрос был не в причине, а вообще как факт это реализовать и в чем я ошибаюсь
насчет совмещения .mm это раз, а во вторых какое это отношение имеет к С++ коду ? я уже написал что ObjC используется только для получение времени в начале интерации и в конце - все
если подскажите как в xcode получить время в ms без ObjC я буду только рад ... из std::time получаю только секунды что не позволит сделать более точный замер
если сомневаетесь - замер ( на глаз ) в cpp файле дает такой же результат ... вектор, выполняется дольше ( мог бы дернуть время в ms сделал бы более точный замер из CPP ... )
I
> собственно как это реализовать ?
Что реализовать?
> я получил разницу в 7 раз
Могу посоветовать никогда не создавать вектор векторов векторов.
I
> То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?
Он будет сопоставим по скорости с malloc.
Но сравниваешь ты конечно образцово... Сам придумал или надоумил кто потроллить?
I
> То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?
realloc у тебя просто переносит данные из одного места в другое. А вектор выделяет память, вызывает конструкторы копирования векторов, которые вызывают конструкторы копирования еще одних векторов.
Ghost2
Меня вот этот код допустим напряг
a*obj = new a(); myArray[0] = &a;
Дальше же пошел такой лютый naming convention, что цензурные слова неожиданно кончились )))
CasDev
> Дальше же пошел такой лютый naming convention, что цензурные слова неожиданно
> кончились )))
это как бы псевдокод был ...
вопрос был еще в заголовке темы
как сделать массив ссылок на объекты
Ghost2
> Могу посоветовать никогда не создавать вектор векторов
окей, как тогда мне отобразить структуру
class someB{ } typedef struct { array<someB> list; }a; array<a> listA
блин я не собираюсь разводить срач и что то тролить ... мне нужен массив ссылок на объекты максимально быстрый ...
I
a** MyArray;
или
std::vector<a*> MyArray;
Alexander K
спасибо ) понял что у меня пробел в указателях С++ ушел читать )
I
Имей ввиду, что если используешь голые указатели
std::vector<A*> dataList;
то помимо new, вызывать delete надо тоже вручную, т.е. в результате кода
size_t size = 5; std::vector<A*> dataList; dataList.reserve(count); for (size_t index = 0 ; index != size; ++index) { A* aObject = new A(); dataList.push_back(aObject); } dataList.clear(); // leak
поимеем утечек на count * sizeof(A).
Поэтому за конструкции типа
A aObject; dataList.push_back(&aObject);
вполне могут и расстрелять лишить уютного теплого кресла, предварительно разбив его о тупые конечности.
Тема в архиве.