В чём отличия lifetime от storage duration?

В чём отличия lifetime от storage duration? Вроде бы это одно и тоже, но их почему-то разделяют друг от друга. Объясните, пожалуйста.


Ответы (2 шт):

Автор решения: eanmos

С точки зрения языка 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);
}

Продолжительность хранения — это просто некоторая формальная информация об объекте, зная которую, мы можем сказать, каким правилам будет подчиняться его продолжительность жизни. В то же время, продолжительность жизни — это уже нечто более «реальное», то что можно наблюдать в реальности.

→ Ссылка
Автор решения: KoVadim

Потому что 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

→ Ссылка