Бывает, что функция использует локальный буфер для подготовки некоторого блока данных ограниченного размера и передачи его другой функции, например:
void foo()
{
char buffer[MAX_SIZE];
size_t size = write_fancy_things(buffer);
bar(buffer, size);
}
Однако, в зависимости от значения MAX_SIZE
,Вы можете быть обеспокоены тем, что съели бы слишком много стека и заменили код на что-то похожее на следующий пример (но, надеюсь, с большей осторожностью относительно управления памятью):
void foo()
{
static char *buffer = new char[MAX_SIZE];
size_t size = write_fancy_things(buffer);
bar(buffer, size);
}
В общем случае эти две функции должны работать следующим образом:так же.Однако в первом примере, если MAX_SIZE
слишком велико, мы с большей вероятностью достигнем предела стека.Использование больших значений может быть хорошо, если вы знаете, где используется функция, но иногда это не так.
Во втором примере мы имеем дело с дополнительным косвенным обращением, и буфер более подвержен ошибкам кэша ЦП, что может быть в том случае, если foo
лежит на критическом пути с низкой задержкой, и мы ожидаем, что затраты на подготовкув большинстве случаев размер буфера будет очень низким.
Какой размер вы считаете слишком большим для размещения в стеке?Кроме того, есть ли какое-либо наказание за размещение большого блока данных в стеке, но с использованием только его небольшой части?
РЕДАКТИРОВАТЬ: write_fancy _things
это просто синоним высказывания * I 'm записывает некоторые данные в буфер размером от 1 до MAX_SIZE *.Второй пример foo
можно представить как метод класса, а статический указатель - как член класса, размещенный в конструкторе.Я просто, вероятно, упростил вещи, но не хотел вводить больше сложности, чем нужно, и сосредоточиться на проблемах стека.