ПрограммированиеФорумОбщее

array references как ?

#0
15:21, 15 фев 2014

Привет ) давольно простой вопрос
есть к примеру

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
16:06, 15 фев 2014

Возможные причины:
1. Отладочный версия. Инлайн-подставновки в дебаг-сборке не производятся.
2. Не знаю как ты совместил С++ и objectiveC, они сильно отличаются по внутренней механике. В objectiveC все функции виртуальные, а это существенные дополнительные затраты.

#2
16:14, 15 фев 2014

Zab
То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?

и вобще вопрос был не в причине, а вообще как факт это реализовать и в чем я ошибаюсь

насчет совмещения .mm это раз, а во вторых какое это отношение имеет к С++ коду ? я уже написал что ObjC используется только для получение времени в начале интерации и в конце - все

если подскажите как в xcode получить время в ms без ObjC я буду только рад ... из std::time получаю только секунды что не позволит сделать более точный замер

если сомневаетесь - замер ( на глаз ) в cpp файле дает такой же результат ... вектор, выполняется дольше ( мог бы дернуть время в ms сделал бы более точный замер из CPP ... )

#3
16:17, 15 фев 2014

I

> собственно как это реализовать ?
Что реализовать?

> я получил разницу в 7 раз
Могу посоветовать никогда не создавать вектор векторов векторов.

#4
16:24, 15 фев 2014

I
> То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?
Он будет сопоставим по скорости с malloc.

Но сравниваешь ты конечно образцово... Сам придумал или надоумил кто потроллить?

#5
16:26, 15 фев 2014

I

> То есть ты утверждаешь что вектор будет быстрее простого маллока/реаллока ?
realloc у тебя просто переносит данные из одного места в другое. А вектор выделяет память, вызывает конструкторы копирования векторов, которые вызывают конструкторы копирования еще одних векторов.

#6
16:31, 15 фев 2014

Ghost2
Меня вот этот код допустим напряг

a*obj = new a();
myArray[0] = &a;

Дальше же пошел такой лютый naming convention, что цензурные слова неожиданно кончились )))

#7
16:42, 15 фев 2014

CasDev
> Дальше же пошел такой лютый naming convention, что цензурные слова неожиданно
> кончились )))
это как бы псевдокод был ...

вопрос был еще в заголовке темы

как сделать массив ссылок на объекты

Ghost2
> Могу посоветовать никогда не создавать вектор векторов
окей, как тогда мне отобразить структуру

class someB{
}
typedef struct {
     array<someB> list;
}a;
array<a> listA

блин я не собираюсь разводить срач и что то тролить ... мне нужен массив ссылок на объекты максимально быстрый ...

#8
17:03, 15 фев 2014

I

a** MyArray;

или

std::vector<a*> MyArray;
#9
17:17, 15 фев 2014

Alexander K
спасибо ) понял что у меня пробел в указателях С++ ушел читать )

#10
20:56, 16 фев 2014

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);

вполне могут и расстрелять лишить уютного теплого кресла, предварительно разбив его о тупые конечности.

ПрограммированиеФорумОбщее

Тема в архиве.