Comments 23
Самое главное (для начинающих) про порядок инициализации не рассказали.
Мне кажется, что сегменты — это уже platform-specific?
Про инициализацию статической переменной в функции и многопоточность не рассказали.
stackoverflow.com/questions/1661529/is-meyers-implementation-of-the-singleton-pattern-thread-safe
По ссылке первый ответ ссылается на стандарт.
В c++11 и выше статические переменные создаются один раз на все потоки. Это может вызывать проблему, так как такое создание по сути обернуто в мьютекс, что может вызывать падение производительности
Вообще то, на мой взгляд, применение слово static в плюсах совершенно очевидным образом перегружено, причем весьма далекими по значению смыслами.
inline определит только один экземпляр функции, в то время как static для каждого включения будет иметь свою локальную статическую переменную в функции
Я еще периодически стреляю себе в ногу, когда делаю статическую переменную внутри метода, а потом оказывается, что она общая для всех объектов такого класса -_-'
Да как и в функции, в принципе — чтобы состояние сохранить до следующего вызова. Только тут надо бы в объект поле добавить, а что-то лень, сделаю просто static...
Вы не имеете доступа к указателю this класса, потому что мы не создаем никакого объекта для вызова этой функции.
Добавил бы, что static методы в классе не имеют скрытый параметр this, который всегда есть у обычных методов.
Начиная с С++17 есть еще одна замечательная вещь: inline static data member. Позволяет писать header-only библиотеки без всяких трюков.
Пример:
//file.h
struct A {
inline static int a;
};
A::a
здесь полностью определена без необходимости в cpp файле.
Ну и если смешивать в рассказе о static все его области применения, то имеет смысл до кучи добавить и простые глобальные переменные, которые тоже располагаются в статической памяти, заодно есть повод рассказать о порядке вызова их конструкторов.
Спасибо! Отличная статья
Пока смерть не разлучит нас или всё о static в C++