Распределение стека в c ++ для больших размеров

0

Я пытаюсь загрузить множество примитивов с помощью Direct3D 9, поэтому мне нужно передать большой массив структуры в виртуальный буфер. Но если я делаю это с помощью malloc(), моя функция sizeof() возвращает неправильное значение (всегда 4). И если я обычно выделяю стек памяти (array[number]), стек может переполняться из-за количества элементов. Есть ли альтернатива этому? Как выделить стек памяти, который может загружать столько данных?

PS Я не собираюсь рисовать их на экране, но мне все еще нужна их информация о вершинах.

  • 0
    Используйте std::vector или следите за размером самостоятельно.
  • 0
    Если вам интересно, почему вы всегда получаете 4, вы берете размер указателя на массив, а не сам массив.
Теги:
direct3d

4 ответа

1
Лучший ответ

При использовании с указателем оператор sizeof возвращает размер указателя, а не то, на что указывает.

Когда вы распределяете память динамически (в C++ используйте new вместо malloc), вам нужно отслеживать количество записей самостоятельно. Или еще лучше, используйте, например, std::vector.

  • 0
    Почему sizeof работает правильно, когда дело доходит до стека нединамических массивов?
  • 0
    @ user2999436 Потому что тогда компилятор на самом деле имеет размер массива, например, количество элементов, умноженное на размер типа массивов.
Показать ещё 1 комментарий
0

Если вы вызвали malloc, вы назвали его размером с объем пространства, который вы хотели. Если вы хотите позже узнать, насколько велико распределение, вам нужно сохранить эту информацию вокруг себя.

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

Если у вас слишком много проблем, поскольку вы используете C++, вы можете использовать <vector> или аналогичный, который будет отслеживать собственный размер. вектор или аналогичный, который будет отслеживать свой собственный размер.

0

Да с malloc() а затем с помощью sizeof() даст вам 4. Это размер указателя.

Если вам просто интересно, как заполнить ваши значения в ptr, обратитесь к следующему коду:

int numOfItems = 10;
int* pArr = (malloc(sizeof(int)*numOfItems);
for (int i=0;i<numOfItems;i++)
    pArr[i] = i+1;
0

Оптимальным вариантом может быть распределение std :: vector динамически и использование умного указателя.

std::shared_ptr< std::vector< your data type> > vertices( new std::vector( number );

Теперь вы не переполняете стек, все соответствующее ведение домашнего хозяйства выполняется с помощью std :: vector и std :: shared_ptr, и, самое главное, память будет удалена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню