Динамическое распределение или автоматическое рекомендуется для создания подсистемы? - PullRequest
1 голос
/ 22 февраля 2011

Я хобби-программист на C ++ и в настоящее время работаю над игрой (использующей Ogre3D), и у меня есть вопрос относительно распределения памяти для моих основных классов.

Я много читал о распределении памяти, автоматическом размещении в стеке и динамически в куче, а также об их различиях (производительность, ограниченный размер стека). Тем не менее, я не уверен, что использовать для моего основного класса (Application) и некоторых других «фабричных» классов (созданных одним экземпляром класса Application), которые будут иметь один экземпляр, существующий на протяжении всего выполнения.

Ниже приведен упрощенный фрагмент макета:

int main() 
{
    // like this (automatic)
    Application app;
    app.create();    // initializing
    app.run();       // runs the game-loop

    // or like this (dynamic)
    Application* app;
    app = new Application();
    app->create();
    app->run();

    return(0);       // only reached after exiting game
}



class Application
{
public:
    Application();   // ctor
    ~Application();  // dtor

    // like this, using 'new' in ctor and 'delete' in dtor (dynamic)
    SceneManager* sceneManager_;   // a factory for handling scene objects
    DebugManager* debugManager_;   // a factory for handling debugging objects

    // or like this (automatic)
    SceneManager sceneManager_;
    DebugManager debugManager_;
};

Лучше ли выделять память в стеке или в куче (как для класса Application, так и для классов фабрики)? И по каким аргументам?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

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

0 голосов
/ 22 февраля 2011

В C ++ вопрос несколько сложнее, но в целом нельзя избежать размещения в куче.Например, ваша операция new выделяет объект Application в куче - new выделяет память динамически во время выполнения, где выделение auto памяти равно , определенное во время компиляции.(На самом деле, конечно, выделено во время выполнения - но оно выделяется, поскольку код запуска создает стек для main в соответствии с скомпилированными выделениями.)

Теперь, почемуВы бы хотели бы , чтобы избежать размещения в куче?Это может быть из-за ограниченных размеров кучи, но с современными машинами это проблема редко, даже в портативных устройствах.Однако пространство стека вполне может быть ограничено.Так что это говорит о куче.

Конечно, auto память не «протекает» - но память, выделенная в основной (или в файловой области, хотя это статично), не освобождается, поэтомуможно было почти утверждать, что это «автоматически» просочилось.

Я думаю, что основной вопрос здесь действительно заключается в том, «почему не будет вы выделите в куче?»Основная причина обычно состоит в том, чтобы избежать утечек памяти, но осторожность при использовании new/delete может защитить вас от этого - и учитывая повсеместное динамическое распределение в библиотеках и тому подобное, вы не можете перестать думать о хорошей гигиене памяти, даже если вы придумаличтобы избежать динамического выделения.

0 голосов
/ 22 февраля 2011

В этой ситуации я думаю, что все сводится к размеру.

Вы не хотите тратить пространство стека, поэтому либо используйте динамическое выделение с new, либо поместите Application в качестве глобальной переменной вне main().

...