У стандартному C ++, безумовно, немає. У переносний спосіб,
ймовірно, немає. У певній ОС іноді. Якщо нічого іншого, ви можете
відкрити власний розмір виконуваного файлу і перевірити заголовки
виконуваного файлу, щоб побачити, що він складається. [Наступною
проблемою є, звичайно, «яка частина стека була використана до цього
біта коду» - що може бути важко визначити].
Якщо ви запускаєте код у окремому потоці, багато з
(низькорівневих) інтерфейсів потоків дозволяють вказати стек (або
стеки), наприклад, потоки Posix pthread_set_stacksize
або MS
_beginthread
. Знову ж таки, ви не
знаєте точно, скільки місця було використано до того, як він
потрапив до фактичного коду потоку - але це, мабуть, не величезна
кількість.
Звичайно, у вбудованій системі (наприклад, мобільному телефоні)
розмір стосів зазвичай досить малий, 4K, 12K або 64KB є дуже
нормальним - іноді навіть набагато менше, ніж у деяких
системах.
Інша потенційна проблема полягає в тому, що ви не можете знати,
скільки простору використовується в стеку - ви можете виміряти за
фактом у компільованій системі, і, звичайно, якщо у вас є локальний
масив стека int масиву [ 25];
, ми можемо знати, що
він займає принаймні 25 * sizeof (int)
- але може бути
заповнення, компілятор зберігає регістри в стеку і т.д.
Редагувати, як запізнення: Я також не бачу багато користі від
двох кодових шляхів:
if (enough_stack_space_for_something)
use_stack_based_algorithm();
else
use_heap_based_algorithm();
Це додасть велику кількість додаткових накладних витрат, і
більше коду, як правило, не є хорошим планом у вбудованій/мобільній
системі.
Edit2: Крім того, якщо виділення пам'яті є основною частиною
середовища виконання, можливо, дивлячись на те, що це, наприклад,
створення блоків об'єктів, допоможе?