Я делаю приложение, которое будет использовать много динамически создаваемых объектов (трассировка лучей).Вместо того, чтобы использовать [new] снова и снова, я подумал, что просто сделаю простую систему памяти, чтобы ускорить процесс.На данный момент это очень просто, так как мне не нужно много.
Мой вопрос: когда я запускаю это тестовое приложение, использование моего диспетчера памяти использует правильный объем памяти.Но когда я запускаю тот же цикл, используя [new], он использует в 2,5–3 раза больше памяти.Есть ли что-то, чего я здесь не вижу, или [новое] влечет за собой огромные накладные расходы?
Я использую VS 2010 на Win7.Также я просто использую диспетчер задач для просмотра использования памяти процесса.
template<typename CLASS_TYPE>
class MemFact
{
public:
int m_obj_size; //size of the incoming object
int m_num_objs; //number of instances
char* m_mem; //memory block
MemFact(int num) : m_num_objs(num)
{
CLASS_TYPE t;
m_obj_size = sizeof(t);
m_mem = new char[m_obj_size * m_num_objs);
}
CLASS_TYPE* getInstance(int ID)
{
if( ID >= m_num_objs) return 0;
return (CLASS_TYPE*)(m_mem + (ID * m_obj_size));
}
void release() { delete m_mem; m_mem = 0; }
};
/*---------------------------------------------------*/
class test_class
{
float a,b,c,d,e,f,g,h,i,j; //10 floats
};
/*---------------------------------------------------*/
int main()
{
int num = 10 000 000; //10 M items
// at this point we are using 400K memory
MemFact<test_class> mem_fact(num);
// now we're using 382MB memory
for(int i = 0; i < num; i++)
test_class* new_test = mem_fact.getInstance(i);
mem_fact.release();
// back down to 400K
for(int i = 0; i < num; i++)
test_class* new_test = new test_class();
// now we are up to 972MB memory
}