Есть ли способ выделить память стека для массива символов? учитывая, что длина известна, однако, контент будет добавлен позже? - PullRequest
0 голосов
/ 04 марта 2020

Я только начал изучать библиотеку OpenGL.

В настоящее время я слежу за видеоруководством по OpenGL.

Учитывая следующий фрагмент кода, чтобы получить сообщение об ошибке для компиляции шейдеров

int result;
    glGetShaderiv(id, GL_COMPILE_STATUS, &result);
    if (result == GL_FALSE)
    {
        int length;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
        char *message = (char *)alloca(length * sizeof(char));
        glGetShaderInfoLog(id, length, &length, message);
        std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment")
                  << " shader" << std::endl;
        std::cout << message << std::endl;
        glDeleteShader(id);
        return 0;
    }

В следующем видео лектор попытался сначала инициализировать сообщение следующим образом:

char message[length];

Однако, поскольку длина не является константой, она не будет компилироваться.

Он решил использовать функцию alloca.

char *message = (char *)alloca(length * sizeof(char));

Однако, когда я запустил его через cppCheck, он говорит:

Устаревшая функция 'alloca ' называется. В C ++ 11 и более поздних версиях рекомендуется использовать вместо него std :: array <> или динамически размещаемый массив. Функция alloca опасна по многим причинам ( Почему использование alloca () не считается хорошей практикой? и http://linux.die.net/man/3/alloca).

Есть ли какая-либо альтернатива функции alloca, которая все еще позволяет выделять стековую память для сообщения?

1 Ответ

0 голосов
/ 04 марта 2020

В C ++ у вас мало выбора для динамического распределения памяти в стеке. Если вы не хотите использовать alloca, тогда вы можете использовать std::string или другие стандартные контейнеры в своем коде. Они довольно эффективны, несмотря на то, что они выделяют память в куче.

В вашем примере кода вам действительно не следует беспокоиться о выделении памяти, если только профилировщик не укажет на снижение производительности.

Если вы действительно обеспокоены управлением памятью в C ++, вы можете написать свою собственную систему управления с использованием распределителей. Например, вы можете выделить большие фиксированные блоки памяти, а затем распределить их между данными, чтобы избежать фрагментации. Вы также можете повторно использовать блоки памяти. Независимо управляя выделением и освобождением памяти, вы можете сделать кучу столь же эффективной, как и стек.

Для справки см. std :: allocator , Запись распределителя памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...