(02.04.2022)
volatile
- информирует компилятор, что значение переменной может меняться извне. Это может произойти под управлением операционной системы, аппаратных средств или другого потока. Поскольку значение может измениться, компилятор каждый раз загружает его из памяти.
Волатильную целочисленную переменную можно объявить как:
int volatile х; volatile int х;
Чтобы объявить указатель на эту переменную, нужно сделать следующее:
volatile int *х; int volatile *х;
Волатильный указатель на неволатильные данные используется редко, но допустим: int *volatile х;
Если вы хотите объявить волатильный указатель на волатильную область памяти, необходимо сделать следующее:
int volatile *volatile х;
Волатильные переменные не оптимизированы, что может пригодиться. Представьте следующую функцию:
На первый взгляд кажется, программа зациклится. Компилятор может оптимизировать ее следующим образом:
Вот теперь цикл точно станет бесконечным. Однако внешняя операция позволит записать 0 в переменную opt
и прервать цикл.
Предотвратить такую оптимизацию можно с помощью ключевого слова volatile
, например объявить, что некий внешний элемент системы изменяет переменную:
Волатильные переменные используются как глобальные переменные в многопотоковых программах — любой поток может изменить общие переменные. Мы не хотим оптимизировать эти переменные.
int (*p)(int, int)
, p
- это указатель на функцию возвращающую int
и принимающую два аргумента типа int
Имя функции - указатель на эту функцию:
int *p2 = realloc(p, new_size)
- изменяет размер выделенной памяти, на то, что попросили (и увел., и умен.) (может двигать или не двигать указатель, зависит от ситуации)
Может закончиться неудачей, если вернет NULL - не освободит память, правильный код
realloc(p, 0)
- НЕ освобождение памяти! (malloc
и realloc
тратит прамяти больше, чем вы просили!)
realloc
- очевидно, медленно работает, не надо его писать в цикле, увеличивая рамер на 1
. (после иниц массива, можно изменить размер на строго нужное)
Если выделять память в 2 раза больше - если realloc
не удался - можем попробовать выделить на четверть (главное, чтобы 1/4 != 0
).
typedef
- это как создание переменной, но создание типа (как можно создать переменную, так можно создать и тип)
Не трогали:
Синтаксический сахар - эквивалент для уменьшения кода. Плюс C++ в том, что идею можно отобразить меньшим кодом, минус - понять такой код сложнее
С - void * <----> ...*
С++ - void * <---- ...*
В C++ необходимо писатьint *p2 = (int *) realloc(p, new_size);
Отключить - extern "C"
перед обьявлением функции (нельзя давать комп С)
Можно значения по умолчанию писать через
не перегрузка: (аргументы по умолчанию)