В чём отличия lifetime от storage duration?
В чём отличия lifetime от storage duration? Вроде бы это одно и тоже, но их почему-то разделяют друг от друга. Объясните, пожалуйста.
Ответы (2 шт):
С точки зрения языка C, согласно параграфу 1 раздела “6.2.4 Storage durations of objects” стандарта C99:
Объект имеет продолжительность хранения (англ. storage duration), которая определяет его время жизни (англ. lifetime). Существуют три продолжительности хранения: статическая, автоматическая и динамическая (англ. allocated). <…>
Второй параграф того же раздела гласит
Время жизни объекта — это часть времени исполнения программы, во время которой гарантируется, что хранилище будет зарезервировано для этого объекта. На протяжении своего времени жизни объект существует, имеет постоянный адрес и хранит последнее сохраненное в него значение. <…>
В целом стандарт определяет зависимость времени жизни объектов от их продолжительности хранения следующим образом:
Если объект объявлен с классификатором
staticили имеет внешнюю или внутреннюю линковку, то он будет иметь статическую продолжительность хранения, а его время его жизни будет всем временем исполнения программы.Если объект не имеет линковки и не объявлен как
static, то он будет иметь автоматическую продолжительность хранения, а время его жизни начнется с начала соответствующего блока и до его конца.Если память для объекта выделена с помощью функций
calloc,mallocилиrealloc, то ему присваивается динамическая продолжительность хранения, и время его жизни длится от момента выделения памяти до момента освобождения.
Таким образом, продолжительность хранения — это некоторое свойство объекта, которое определяет то, каким будет время его жизни. То есть на протяжении какого времени, для этого объекта будет зарезервировано место в памяти.
Два разных объекта могут иметь одну и ту же продолжительность хранения, но разное время жизни, например:
#include <stdlib.h>
int
main(void)
{
/* Оба объекта, для которых malloc выделил память имеют
* динамическую продолжительность хранения.
*
* Однако время жизни объекта *a начнется раньше, чем
* время жизни объекта *b.
*/
int *a = malloc(sizeof *a);
int *b = malloc(sizeof *b);
/* Время жизни объекта *a закончится раньше,
* чем время жизни объекта *b.
*/
free(a);
free(b);
}
Продолжительность хранения — это просто некоторая формальная информация об объекте, зная которую, мы можем сказать, каким правилам будет подчиняться его продолжительность жизни. В то же время, продолжительность жизни — это уже нечто более «реальное», то что можно наблюдать в реальности.
Потому что lifetime определяется по storage duration.
Lifetime - это то, когда объект будет официально живой и доступен (после вызова delete или по висящей ссылке объект как бы может быть доступен, но вот стоит ли так делать).
storage duration - это как компилятор должен организовать его - сохранить на стеке, в специальном месте для каждого потока, или пользователь сам будет в хипе создавать-удалять.
Если storage duration - стек (раньше это называлось "автоматический"), то время жизни - до парной фигурной скобки. Компилятор сам добавит деструктор в нужное место.
Если storage duration динамический, то время жизни определяется парой new-delete (в новом 20 или 23 стандарте malloc/free тоже может так делать).
Еще есть static, thread и register (который с 17 стандарта официально отдан на откуп компилятору).
Со static внутри функции все очень интересно - объект создается при первом обращении к объекту и будет жить до конца.
https://en.cppreference.com/w/cpp/language/storage_duration
Парный вопрос https://stackoverflow.com/questions/21392160/storage-duration-vs-lifetime