Я реализовал функцию, которая требует некоторого временного стекового пространства, количество которого зависит от одного из его входов.Это пахнет как распределение памяти в стеке переменной длины, что не всегда считается хорошей идеей (например, оно не является частью C90 или C ++ и в этом контексте доступно только в gcc через расширение).Тем не менее, моя ситуация немного отличается: я знаю, сколько байтов я выделю во время компиляции, просто оно отличается для нескольких различных вызовов этой функции, разбросанных по моей кодовой базе.
C99Кажется, с этим все в порядке, но это не то, что, например, реализует Visual Studio, и, таким образом, мой CI работает на Windows не удается.
Кажется, у меня есть несколько вариантов, ни один из которых не является хорошим.Я надеюсь, что этот вопрос может либо убедить меня в одном из них, либо предоставить более идиоматическую альтернативу.
- Выделить пространство стека вне вызова функции, основываясь на константе времени компиляции, которую я быв противном случае передать в качестве параметра, а затем передать указатель.
- Превратить мою функцию в макрос.
- Превратить мою функцию в макрос-обертку, который затем выделяет пространство стека и передает его в«настоящая» функция (по сути, объединяющая 1 и 2).
- Каким-то образом убедите Visual Studio, что это нормально ( соответствующий NMakefile ).
Цель здесьне только для получения чего-то, что работает и является достаточно производительным, но и для того, чтобы было читабельным и чистым , поскольку это сильно согласуется с контекстом проекта, частью которого он является.Я должен отметить, что распределение в куче также не вариант здесь.
Как мне лучше всего с этим справиться?
Если вы предпочитаете больше практического, реального контекста, вот комментарий Github, где я описываю свой конкретный пример этой проблемы .