С неприятным удивлением обнаружил, что компилятор VC++, вплоть до самых последних версий, при отключенных оптимизациях совершенно не следит за выделением стека под объекты с разными областями видимости, которые можно было бы перекрыть в стековом кадре. Например, вот такая функция:
void f () {
{
int a [100];
...
}
{
int b [100];
...
}
{
int c [100];
...
}
}
выделяет в стеке минимум 1200 байт, размещая каждый массив в отдельной области, и только при включенных оптимизациях компилятор делает перекрытие, размещая их друг поверх друга.
Проблема в том, что я издавна наделал себе шаблонов-хелперов, создающих временные объекты (например, автоматически преобразующиеся к строке, в которую хелпер записывает что-то, определяемое его параметрами). Все прекрасно работало до тех пор, пока в ядерном коде не начались переполнения стека (он там всего 12 кб для 32-разрядного кода). Например, если хелпер создает временный объект размером в сотню байтов, то отладочная сборка функции с парой десятков последовательных вызовов такого хелпера создает в стеке кадр в два килобайта.
pragma optimize действует только на функцию в целом, поэтому оборачивание ими подобной функции лишает меня возможности нормально смотреть локальные переменные. А выделять память динамически с такой частотой в реальном времени — моветон.
Если вдруг кто изучал особенности кодогенерации MS VC++ в этом плане — можно ли его как-то заставить складывать новые автоматические объекты поверх уже вышедших из области видимости без включения оптимизации всей функции?