1

Тема: Storage duration в C++

Вітаю, недавно був на співбесіді і мені задали питання щодо storage duration в С++ виявилось, що я недостатньо в них розбираюсь. Ось схожий приклад коду:

class Cool {
public:
    Cool(std::string name) {}
    ~Cool() {}
};

int main() {
    Cool guy("first");

    new (&guy) Cool("second");

    Cool* girl = new Cool("third");
}

Питання було: який storage duration має first, second, third? Я відповів static, static, dynamic. Зараз я розумію, що я поплутав static з automatic, а те що називають static я чомусь думав, що це global. Про це мені пояснили, але я так і не зрозумів, так а яка мала б бути правильна відповідь?

Подякували: wander1

2

Re: Storage duration в C++

mimik написав:

а яка мала б бути правильна відповідь?

automatic, dynamic, dynamic.

Подякували: mimik1

3

Re: Storage duration в C++

А чому друга dynamic?

4

Re: Storage duration в C++

А, яка ж ще там могла бути, окрім як dynamic?

5

Re: Storage duration в C++

Друга automatic. Питання ж про storage duration. А він закінчується із функцією.
А взагалі треба одразу казати, що так робити - кака, а вже потім починати розбирати.

Подякували: Arete, leofun012

6

Re: Storage duration в C++

koala написав:

Друга automatic.

Ну, почнімо з того, що:

https://eel.is/c++draft/basic.stc.general#2 написав:

The dynamic storage duration is associated with objects created by a new-expression.

koala написав:

Питання ж про storage duration. А він закінчується із функцією.

Storage duration в першу чергу характеристика об'єкта:

https://eel.is/c++draft/basic.stc.general#1 написав:

The storage duration is the property of an object [...]

koala написав:

А взагалі треба одразу казати, що так робити - кака, а вже потім починати розбирати.

Класичне питання зі співбесіди :D

Подякували: mimik1

7

Re: Storage duration в C++

А хіба оцей new (&obj) ... {} це те саме, що повноцінний new/delete?

8

Re: Storage duration в C++

wander написав:

The dynamic storage duration is associated with objects created by a new-expression.

new (&guy) Cool("second");

Так, але в даному випадку має місце placement new expression. Додаткова пам'ять під змінну не виділяється, а використовується та яка вже є. В даному випадку це стек, який видалиться після виходу зі скоупа.

Подякували: leofun011

9 Востаннє редагувалося wander (23.04.2021 17:48:47)

Re: Storage duration в C++

mimik написав:

А хіба оцей new (&obj) ... {} це те саме, що повноцінний new/delete?

Не зовсім зрозумів питання, але якщо ви про те, чи є placement-new new-expression на рівні зі звичайним new, то так.

Arete написав:

Так, але

Так, і без але :)

Arete написав:

В даному випадку має місце placement new expression. Додаткова пам'ять під змінну не виділяється, а використовується та яка вже є.

Ем, а до чого тут storage duration?) І так, в додачу створюється новий об'єкт.

Подякували: mimik1

10

Re: Storage duration в C++

Дивлюся я на плюси і розумію простоту асемблера. Шкода що він не багатоплатформний. Втім,треба побавитися з фортом.

Подякували: koala, cheappi3862

11

Re: Storage duration в C++

Пишіть java-байткод

12

Re: Storage duration в C++

The storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object.
Ну, в принципі, так, мінімально - це до виклику delete. Однак потім... Ой що буде.

13

Re: Storage duration в C++

wander, мені здається я розумію що ви хочете сказати.


The storage duration is determined by the construct used to create the object.
Яким способом створили об'єкт такий і storage duration.

The dynamic storage duration is associated with objects created by a new-expression ([expr.new]).
Використали new-expression значить duration - dynamic. Все зрозуміло, розходимось.


З іншого боку.
The storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object.
Це властивість об'єкта, яка визначає час життя сховища, що містить цей об'єкт. Тобто властивість визначає час життя сховища. Чому це властивість саме об'єкта, якщо вона визначає час життя саме сховища? До того ж називається storage duration, а не object duration.
Якесь дурацьке визначення.

new (&guy) Cool("second");

Об'єкт змінився? Так, створили новий об'єкт.
Сховище змінилось? Ні. Його час життя змінився? Ні. А властивість яка визначає час життя? Судячи по означенню так, це ж властивість об'єкта...

Подякували: leofun011

14

Re: Storage duration в C++

Але вивчення https://eel.is/c++draft/intro.object призводить до висновку, що first і second - один об'єкт: Two objects with overlapping lifetimes that are not bit-fields may have the same address if one is nested within the other, or if at least one is a subobject of zero size and they are of different types; otherwise, they have distinct addresses and occupy disjoint bytes of storage.

15 Востаннє редагувалося wander (23.04.2021 21:09:41)

Re: Storage duration в C++

Arete написав:

Яким способом створили об'єкт такий і storage duration.

Ну, так. Тобто storage duration - це про спосіб створення об'єкту, а не де саме його створили. В одному і тому ж "місці" в різний час можуть бути об'єкти з різним storage duration.

Arete написав:

А властивість яка визначає час життя? Судячи по означенню так, це ж властивість об'єкта...

Так, змінилась, бо в нас і об'єкт новий, отже можна мати інші властивості. Цілком закономірно, а старий об'єкт так і залишився з automatic storage duration.

Але вивчення https://eel.is/c++draft/intro.object призводить до висновку, що first і second - один об'єкт: Two objects with overlapping lifetimes that are not bit-fields may have the same address if one is nested within the other, or if at least one is a subobject of zero size and they are of different types; otherwise, they have distinct addresses and occupy disjoint bytes of storage.

І за допомогою якої магії вони стали overlapping?)
Якщо lifetime of the `first` завершився.

Подякували: mimik1

16

Re: Storage duration в C++

Так не завершився ж. Деструктор не був викликаний, його просто примусово перезаписали. Деструктор не викликався.

Подякували: leofun011

17 Востаннє редагувалося wander (23.04.2021 21:46:09)

Re: Storage duration в C++

Завершитись lifetime об'єкта може кількома способами:
1. почався виклик деструктора;
2. storage, яке займає об'єкт, звільнилося або було перевикористане.

Прихований текст
N4659:Object lifetime 6.8\1 написав:

The lifetime of an object o of type T ends when:
— if T is a class type with a non-trivial destructor, the destructor call starts, or
— the storage which the object occupies is released, or is reused by an object that is not nested within o.

Я навмисне цитую С++17, бо в С++20 дещо змінилося (хоча це і не відноситься до даного питання), я думаю ще немає сенсу сильно вдарятися в С++20, бо їх ще досі повноцінно не завезли.

Подякували: koala, leofun01, mimik3

18

Re: Storage duration в C++

wander написав:

Завершитись lifetime об'єкта може кількома способами:
1. почався виклик деструктора;
2. storage, яке займає об'єкт, звільнилося або було перевикористане.

Прихований текст
N4659:Object lifetime 6.8\1 написав:

The lifetime of an object o of type T ends when:
— if T is a class type with a non-trivial destructor, the destructor call starts, or
— the storage which the object occupies is released, or is reused by an object that is not nested within o.

Я навмисне цитую С++17, бо в С++20 дещо змінилося (хоча це і не відноситься до даного питання), я думаю ще немає сенсу сильно вдарятися в С++20, бо їх ще досі повноцінно не завезли.

Цікаво, не знав про це. В книжках другий пункт якось опускають. А загалом наведений код, якщо розглядати його з практичної точки зору, має право на життя? Я про перевикористання об'єкту через цей new (&).

19 Востаннє редагувалося wander (24.04.2021 02:33:22)

Re: Storage duration в C++

mimik написав:

А загалом наведений код, якщо розглядати його з практичної точки зору, має право на життя?

Ну, загалом так, має, чому ні? Хоча звісно потрібно бути акуратним, бо впіймати UB доволі легко :)

Arete написав:

Це властивість об'єкта, яка визначає час життя сховища, що містить цей об'єкт. Тобто властивість визначає час життя сховища. Чому це властивість саме об'єкта, якщо вона визначає час життя саме сховища? До того ж називається storage duration, а не object duration.
Якесь дурацьке визначення.

Ну, по-перше, storage не розглядається окремо від об'єкта. Тільки разом з об'єктом ця властивість має сенс. І окремо від storage об'єкт теж розглядати не можна, бо storage напряму впливає на його lifetime.
А, по-друге, погоджусь, що назва не ідеальна (ну це стандарт), можна було б назвати і object storage duration, але видно ця здалась комітету задовгою :)

Подякували: leofun011