Q1.Я хочу знать, есть ли способ проверить, сколько стековой памяти будет использовать мой код, проверка производительности кода (оптимизация), утечка памяти.
Не совсем.Стандарт C даже не упоминает стек, и любой компилятор C может создавать двоичные файлы, которые не используют стек и все еще соответствуют стандарту C.
Однако в действительности стек почти всегда используется, и накладные расходыочень маленькийПросто суммируйте все локальные переменные, и вы получите хорошую оценку.
Производительность не следует прогнозировать.Его следует измерить, а затем оптимизировать при необходимости.
Компилятору очень трудно, если не невозможно, надежно обнаруживать утечки памяти.Вы можете использовать такие программы, как Valgrind для этого.
Q2.если структура моего кода похожа на вложенные функции, то из-за вызова function2 внутри цикла for он будет использовать больше стековой памяти, чем один раз?
Нет.Каждый раз, когда вызывается function2()
, создается новый кадр стека с достаточным пространством для 100000 удвоений.Но он будет освобожден сразу же, когда функция вернется.Проблема здесь не в том, чтобы вызывать функцию в цикле.Проблема в том, что вы размещаете ОГРОМНЫЕ массивы в стеке, что может стать проблемой.Вам следует рассмотреть возможность их динамического распределения.По сути, это будет выглядеть так:
void function2
{
double *var = malloc(100000*sizeof(*var));
/* Code */
free(var);
}
Если вы используете рекурсивные функции, стек может стать проблемой.Давайте рассмотрим эту функцию суммы, которая суммирует все натуральные числа вплоть до num:
unsigned long long sum(unsigned long long num)
{
if(num == 0) return num;
return num + sum(n-1);
}
A long long
обычно составляет 8 байтов, поэтому, если вы используете эту функцию для очень большого числа (возможно, 100000 или 1000000), вы можетевозникают проблемы со стеком.