Оптимизация использования стека под временные объекты
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 25.12.19 15:52
Оценка: 4 (2)
С неприятным удивлением обнаружил, что компилятор VC++, вплоть до самых последних версий, при отключенных оптимизациях совершенно не следит за выделением стека под объекты с разными областями видимости, которые можно было бы перекрыть в стековом кадре. Например, вот такая функция:

void f () {
  {
    int a [100];
    ...
  }
  {
    int b [100];
    ...
  }
  {
    int c [100];
    ...
  }
}


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

Проблема в том, что я издавна наделал себе шаблонов-хелперов, создающих временные объекты (например, автоматически преобразующиеся к строке, в которую хелпер записывает что-то, определяемое его параметрами). Все прекрасно работало до тех пор, пока в ядерном коде не начались переполнения стека (он там всего 12 кб для 32-разрядного кода). Например, если хелпер создает временный объект размером в сотню байтов, то отладочная сборка функции с парой десятков последовательных вызовов такого хелпера создает в стеке кадр в два килобайта.

pragma optimize действует только на функцию в целом, поэтому оборачивание ими подобной функции лишает меня возможности нормально смотреть локальные переменные. А выделять память динамически с такой частотой в реальном времени — моветон.

Если вдруг кто изучал особенности кодогенерации MS VC++ в этом плане — можно ли его как-то заставить складывать новые автоматические объекты поверх уже вышедших из области видимости без включения оптимизации всей функции?
vc++ функции стек видимость оптимизация
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.