C "Статическая" Оптимизация - PullRequest
1 голос
/ 17 октября 2010

читаю книгу про оптимизацию техников.Там не так много описания или советы в примере, хотя.Вот в чем дело:

int agag(int a)
{
  static int dfdfdf = 0;
  static int prev_resilt = 0;
  if (dfdfdf == a)
    return prev_result;
  dfdfdf = a;
  a = SomeCalcs();
  prev_result = a;
  return a;
}

Главное: если аргументы такие же, как в предыдущем расчете, он немедленно вернет предыдущий результат, избегая сложных вычислений.Вопрос в том, будут ли эти две статические переменные существовать до конца программы?Как я понимаю, это плохо - иметь много таких?

Я знаю, что это не слишком оптимизация.Но меня беспокоит только влияние статических переменных.

Большое спасибо за ответы!

Ответы [ 4 ]

8 голосов
/ 17 октября 2010

Память, используемая статическими переменными, будет выделена в сегменте данных, а не в куче или стеке. Это становится проблемой только при наличии большого количества статических переменных, так как это означает, что исполняемый файл должен будет загружать с диска гораздо больший сегмент данных.

Но самая большая проблема этого метода заключается в том, что он хранит только одно значение. Лучше просто реализовать правильную памятку , если вы ожидаете много повторов с одними и теми же входами.

8 голосов
/ 17 октября 2010

Да, время жизни переменных static до конца программы.

Однако, это добавляет состояние к вашей функции.Это делает его не потокобезопасным, сложным для отладки и более сложным для тестирования.Как правило, это плохие вещи.

0 голосов
/ 17 октября 2010

Вы забыли назначить dfdfdf с a, среди прочих мелких ошибок.

Да, две переменные будут занимать память на весь срок жизни программы, как если бы они были глобальными. Они, вероятно, будут использовать 8 байтов. Код функции agag занимает больше места, чем это, и не будет возвращен до конца программы. Почему бы тебе не беспокоиться об этом?

0 голосов
/ 17 октября 2010

Да, они существуют, пока ваша программа не закончится.Вы в порядке, пока вы уверены, что a вход 0 имеет результат 0.

...