Я думаю, вы путаетесь между значениями static
и const
, что понятно, поскольку вы (и я!) Часто забываете их значение, как только однажды прочитали теорию.
1) Во-первых, const
.Что означает const
, так это то, что мы не будем изменять значение переменной через эту «ссылку» на нее.Это действительно полезно для аргументов функций, особенно при использовании указателей, так что вы не редактируете значения, которые вы не собирались.Например, произвольно:
void add(int* result, const int* a, const int* b)
Это объявление означает, что если мы случайно набрали a = result + b;
, компилятор должен пожаловаться и отказаться от компиляции.В этом случае мы назвали переменные таким образом, что мы не должны перезаписывать их даже случайно, но в более сложных сценариях это может произойти.
Однако, как говорит pmg, это не означает, чтозначение не изменится;это просто означает, что когда мы говорим об этой версии этого адреса / значения, мы не будем ее менять.Я хочу сказать, что полезно защищать аргументы, которые вы не собираетесь изменять, на случай, если вы случайно попытаетесь их изменить.Если вы хотите, чтобы по-настоящему фиксированное значение часто использовалось препроцессором, например, #define TRUE 1
.
2) Теперь static
.Статический означает «не виден за пределами этого блока компиляции».Это похоже на понятие приватности в классах, и я подчеркиваю, но не эквивалентно ему, но в данном случае мы говорим обо всем файле Си.Итак, если мы находимся в файле helloworld.c
и вверху вы пишете:
static int x = 10;
Вы не сможете использовать эту версию x
в helloworld2.c
.
3).мы в этом, мы могли бы также сделать другое слово inline
.inline
, на мой взгляд, является своего рода более приятным способом создания макросов и означает «компилятор, вы должны действительно поместить полученный код этого кода туда, куда вы его вызываете, вместо того, чтобы обходиться нам вызовом функции».Оптимизация компиляторов может сделать это в любом случае, но это действует как явная инструкция для вставки, где это возможно.
Таким образом, эти функции включают все элементы управления языка, а не место, где переменная помещается в различные сегменты исполняемого файла.Как говорит pmg , компилятор может делать все, что ему захочется.
Если вы хотите понять, что сделал компилятор, используйте gcc -S
.Это дает вам вывод на языке ассемблера gcc
, который будет в формате AT & T.Попробуйте это с различными флагами gcc -Ox
, где x=0,1,2,3
, чтобы получить представление о том, как работает оптимизация.
Наконец, стоит отметить, что на самом деле a.out
- это просто имя;ваше современное ядро, вероятно, скомпилировано без поддержки a.out
бинарных файлов.
Я думаю, что этот вопрос вы действительно пытались задать.