static double m = 30000;
double foo(double x, double y) {
return x/m + y;
}
Это ничего не выиграет. Для вычисления нужно сделать копию m. Кроме того, если вы:
double bar(double x, double y) {
m += x + y;
return m;
}
Тогда все вызовы бар изменится м. Статические переменные за пределами функций (или классов) - это действительно глобальные переменные с областью файлов. Другие файлы не могут получить от них extern
Статические переменные внутри функции по-прежнему являются глобальными переменными, за исключением того, что даже другие функции в одном файле не могут видеть их напрямую.
const double m = 30000;
Это лучше и во многих случаях лучше всего. Если компилятор видит эту глобальную константу, а затем видит ссылку на m, то она знает, что вместо того, чтобы генерировать код для загрузки значения из того, где он когда-либо (что, вероятно, требует загрузки буквального адреса в регистр), в регистр или позицию стека для выполнения вычислений он может просто сделать регистр 30000 или иногда генерировать команду с кодировкой 30000 прямо там.
Недостатком этого является то, что компилятор должен предположить, что другие файлы souce захотят прочитать m и должны фактически хранить копию в виде переменной (но постоянной переменной) в объектном файле.
Я не уверен, является ли он стандартным, но иногда можно сделать extern const double m = 30000;
, а компилятор будет использовать 30000 для оптимизации и предположить, что на другом файле есть копия m, которая будет сохранена в исполняемом файле. Вы также можете сделать static const double m = 30000;
, и компилятор может предположить, что никто другой не ожидает, что копия m будет сохранена в объектном коде, сгенерированном из этого исходного файла.
Ведение
#define m 30000
является более рискованным. Вы не получите предупреждение или ошибку, если ранее было другое m, объявленное как переменная, константа или функция. Кроме того, для макросов препроцессора, подобных этому, легко испортиться. Например:
#define BASE_ADDRESS 48
#define MY_OFFSET 9
#define MY_ADDRESS BASE_ADDRESS+MY_OFFSET
...
return MY_ADDRESS*4;
Да, это глупый пример, но то, что это выглядит как после того, как препроцессор будет сделано с ним
...
return 48+9*4;
Что
return 48+(9*4);
И это не то, что вы, вероятно, хотели.
Другое место, где макросы плохие, - это когда у вас большие константы, такие как строки. Строки требуют, чтобы они были адресованы указателем, и их сложнее оптимизировать, чем целые числа и числа с плавающей запятой или константные числа. Вы можете легко сделать очень большую программу, если у вас много вещей, как:
#define JIM "Jim"
#define JOHN "John"
, а затем использовал ДЖИМ и Джон весь вашей программы, потому что компилятор не может быть в состоянии видеть, что вы на самом деле нужны только строки " Джом "и" Джон "один раз в программе.
Это, как говорится, нередко означает, что константы объявляются подобным образом, и часто они надлежащим образом выполняются таким образом людьми, которые знают, что они делают.
Спасибо всем за интересные ответы. Поэтому я считаю, что в моем случае лучше всего иметь статический const double = 30000. – yCalleecharan