LINUX.ORG.RU

Локальная константа функции в языке Си

 ,


0

0

Для функции func необходимо задать локальную константу S.
Значение этой константы должно вычисляться один раз - при первом вызове функции.
При последующих вызовах функции func повторно вычислять значение S не требуется.

const double ANGLE = 0.01745;

void func (void)
{
  static const double S = sin(ANGLE);

}

Правильно ли понимаю, что если удалить ключевое слово static, значение константы S будет вычисляться заново при каждом вызове функции func, то есть компьютер будет выполнять излишнюю работу?

Deleted

правильно понимаешь. ну, если компилер не соптимизирует - но в любом случае лишний опкод будет

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)

Да, если не рассматривать случай умного компилятора, который при компиляции вычислит значение S.

Begemoth ★★★★★
()

выбирай, либо константность (расчет при компиляции, в рантайме не меняется), либо расчет при первом вызове. Рассчитать при первом вызове и в дальнейшем держать константой не выйдет средствами компилятора. Руками реализовать теоретически можно через указатели

marvin_yorke ★★★
()

Да, правильно. Инициализация static происходит один раз. Но и дальнейшие изменения сохраняются между вызовами:

#include <stdio.h>

void
func(void)
{
        static int a = 10;

        printf("%d\n", a);
        a += 10;
}

int
main()
{
        func();
        func();
        func();

        return 0;
}

Одним словом это такая изощрённая глобальная переменная. И ведёт она себя так же.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

Спасибо всем за оперативный ответ!

Константу решил сделать локальной, так как она используется только внутри функции func.

Ключевое слово static добавил, чтобы исключить излишние, повторные вызовы функции sin(ANGLE).

Deleted
()

Сишники как обычно - любой тред скатят в гадания: соптимизирует ли конпелятор?, сэкономит ли инструкций?, как бы не писать на асме, но чтоб все быстро работало?

anonymous
()

читай static как «прибить гвоздем вот прямо тута», соответственно всякий раз как ты будешь заходить в эту функцию будешь наблюдать ровно то, что нагадил в прошлый раз.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.