|
28.03.2009, 23:52
|
#1
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Создание динамического массива объектов класса
Вообщем погуглил ... и пришол к выводу что такое только реально сделать через указатели, но это очень тормозное решение.
В итоге думаю сделать скажем изначально массив [16], и потом если надо будет еще что то добавить просто сделаю удвоение размера этого же массива - П,С, - думаю лагать не будет и быстрее указателей
|
(Offline)
|
|
29.03.2009, 00:05
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Создание динамического массива объектов класса
Вообщем погуглил ... и пришол к выводу что такое только реально сделать через указатели, но это очень тормозное решение.
|
любой динамический массив делается через указатели.
если тебе нужен массив с постоянно меняющимся размером, то нужно юзать другие структуры данных. например связанные списки.
|
(Offline)
|
|
29.03.2009, 00:30
|
#3
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: Создание динамического массива объектов класса
судя по тестам обычный массив работает на порядок быстрее, realloc и vector кто юзал?
или может вообще пихать в структуру
|
(Offline)
|
|
29.03.2009, 01:22
|
#4
|
|
Ответ: Создание динамического массива объектов класса
Aceton
прочитай хотя бы какую-то книжку для начинающих по C++, рекомендую "C++ за 21 день"
сразу все такие вопросы отпадут, или хотя бы удостоверся что точно и полностью понимаешь что такое обьект, а что такое указатель на обьект, а что такое класс и что такое масив
если тебе плевать на учёбу и нужен результат тут и сразу - используй std::vector
|
|
|
29.03.2009, 14:17
|
#5
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: Создание динамического массива объектов класса
не принимай меня за полного нуба))) я прекрасно понимаю что это все значит, просто 5 лет работал на php и прочив веб вещах, сишнег знаю выше уровня нуба
|
(Offline)
|
|
29.03.2009, 15:03
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Создание динамического массива объектов класса
сишнег знаю выше уровня нуба
|
везет тебе. я тоже хочу знать выше уровня нуба.
Это:
#include <iostream>
#include <conio.h>
#include <windows.h>
int main()
{
__int64 l,fq;
__int64 t1=0,t2=0;
__int64 r1=0,r2=0;
QueryPerformanceFrequency((LARGE_INTEGER*)&fq);
const int cnt = 250000;
const int tests = 100;
int stack_array[cnt]; //массив в стеке
int *heap_array = new int[cnt]; //массив в куче (через указатели)
for(int t=0;t<tests;++t)
{
// первый тест
QueryPerformanceCounter((LARGE_INTEGER*)&t1);
for(int i=0;i<cnt-1;++i)
{
stack_array[i]=stack_array[i+1]+2;
}
QueryPerformanceCounter((LARGE_INTEGER*)&l);
r1 += (l-t1);
// второй тест
QueryPerformanceCounter((LARGE_INTEGER*)&t2);
for(int i=0;i<cnt-1;++i)
{
heap_array[i]=heap_array[i+1]+2;
}
QueryPerformanceCounter((LARGE_INTEGER*)&l);
r2 += (l-t2);
}
std::cout<<"stack array time = "<<(float)r1/(float)fq<<" sec."<<std::endl;
std::cout<<"heap array time = "<<(float)r2/(float)fq<<" sec."<<std::endl;
_getch();
return 0;
}
на моей машине дает такие результаты:
т.е.да, на стеке массивы быстрее. совсем чуть-чуть но быстрее. но их размеры нельзя менять (более того, их размеры должны быть определены на стадии компиляции). + это значение сильно ограниченно. так, например массив в 300000 элементов уже не создается.
Последний раз редактировалось HolyDel, 29.03.2009 в 15:13.
|
(Offline)
|
|
29.03.2009, 15:20
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Создание динамического массива объектов класса
Сообщение от HolyDel
везет тебе. я тоже хочу знать выше уровня нуба.
|
и я!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
29.03.2009, 16:33
|
#8
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: Создание динамического массива объектов класса
смотря что понимать под этим уровнем
|
(Offline)
|
|
29.03.2009, 16:41
|
#9
|
Бывалый
Регистрация: 04.01.2008
Адрес: Казахстан \ Талдыкорган
Сообщений: 659
Написано 170 полезных сообщений (для 509 пользователей)
|
Ответ: Создание динамического массива объектов класса
std::vector.
__________________
Жизнь как говориться игра- делать игры моя профессия(с)
Программирование, это религия! Её нужно исповедовать.
|
(Offline)
|
|
29.03.2009, 16:51
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Создание динамического массива объектов класса
мой выбор (если скорость критична) - обычный динамический массив в куче, размером в max элементов. по сути это будет обычным std::vector с reserve(max)
минусом является перерасход памяти
плюсом - скорость и простота.
Последний раз редактировалось HolyDel, 29.03.2009 в 16:59.
|
(Offline)
|
|
29.03.2009, 19:01
|
#11
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: Создание динамического массива объектов класса
сделал через map и указатели , вот пример загрузщика карты, правда недоделанный, но рабочий
читает из файла данные и рисует обьекты
#include "../lsd.h"
#include "../blitz3dsdk.h"
#include <fstream>
#include "../player.h"
#include "../terrain.h"
#include "../building.h"
#include <map>
using namespace std;
void CLSD::LoadMap(){
map<int,CBuilding*> buildings;
char buf[128];
char *param;
int i,j=1,p=10;
int item,type,x,y,z,X,Y,Z;
ifstream map;
map.open("D:\\map.map");
if(!map.good()){bbRuntimeError("Can't open map file!");}
while(map.getline(buf,sizeof(buf)))
{
param = strtok (buf," ");
i=0;
while (param!=NULL)
{
bbText(10,p,param);
p=p+10;
switch(i)
{
case 0:
item= atoi(param);
break;
case 1:
type= atoi(param);
break;
case 2:
x=atoi(param);
break;
case 3:
y=atoi(param);
break;
case 4:
z=atoi(param);
break;
case 5:
X=atoi(param);
break;
case 6:
Y=atoi(param);
break;
case 7:
Z=atoi(param);
break;
}
param = strtok (NULL," ");
i++;
}
//в зависимости от типа обьекта находим его описание
//и вызываем нужные классы и создаем обьект
switch(type)
{
case 2:
CBuilding *b = new CBuilding ;
b->CreateBuilding("objects/buildings/box/box.3ds",type,x,y,z,X,Y,Z);
buildings[j]=b;
break;
}
j++;
}
}
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:40.
|