Векторный объект, который размещается в стеке для небольшого размера или в куче для больших - PullRequest
0 голосов
/ 21 сентября 2018

В приложениях реального времени, например, в аудиопрограммах, вам следует избегать выделения памяти в куче во время обратных вызовов, поскольку время выполнения не ограничено.Действительно, если вашему исполняемому файлу не хватает памяти, вам нужно будет дождаться, пока ОС выделит новый чанк, который может занять больше времени, чем следующий обратный вызов.Я мог бы хранить память в стеке, например, используя массивы переменной длины (VLA) или alloca(), но если массив слишком велик, вы получаете переполнение стека.

Вместо этого я думал об определении класса с интерфейсом, подобным std::vector, но который внутренне использует стек, если размер меньше определенного threshold, и кучу в противном случае (я предпочитаювозможна неограниченная операция до определенного переполнения стека).Для части кучи я мог бы использовать std::vector или new / delete.Но как насчет стека?VLA и alloca() освобождаются, когда они выходят из области видимости.Какую альтернативу я мог бы использовать?

Я мог бы использовать std::array<T, threshold>, но это потратило бы впустую память.Я ожидаю, что мой threshold будет порядка 2048.

1 Ответ

0 голосов
/ 21 сентября 2018

Если существует вероятность того, что данные могут быть сохранены в стеке, и если размер превышает пороговое значение, определяется только во время выполнения, тогда ваш тип будет иметь для включения некоторыхКонтейнер стека достаточно большой, чтобы вместить что-то пороговое значение размера (будь то std :: array или что-то еще), что делает вашу проблему

Я мог бы использовать std :: array, но это потратило бы впустую память.Я ожидаю, что мой порог будет порядка 2048.

неизбежно.Я не думаю, что есть способ обойти это.Например, в коде, подобном

uint32_t N = code_that_determines_size_at_runtime();
ThresholdContainer container(N);

, компилятор не может знать, находится ли N выше или ниже порогового значения.Таким образом, чтобы это работало, макет памяти для ThresholdContainer должен содержать память стека для данных вплоть до порогового размера, который был бы неиспользованным и потраченным впустую, когда N> threshold.(Соединение стека и памяти кучи с помощью некоторого итератора, который идет между ними, было бы ужасно, и вам, вероятно, нужна непрерывная память).

Если, с другой стороны, размер по сравнению с порогом известен во время компиляции,Вы можете определить класс, имеющий размер N, который по существу содержит std :: array, если N

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