Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 26.12.18 16:53
Оценка:
Привет!

Правильно я понимаю, что value category (lvalue, rvalue, xvalue, prvalue) имеет смысл только для языков, в которых имеется возможность создавать объекты на стеке и возвращать их через стек?
Отредактировано 26.12.2018 16:54 Максим Рогожин . Предыдущая версия .
Re: Value category и объекты в динамической памяти
От: rg45 СССР  
Дата: 26.12.18 17:56
Оценка: +2
Здравствуйте, Максим Рогожин, Вы писали:

МР>Правильно я понимаю, что value category (lvalue, rvalue, xvalue, prvalue) имеет смысл только для языков, в которых имеется возможность создавать объекты на стеке и возвращать их через стек?


Судя по всему, тебе удалось установить прямую причинно-следственную связь между категориями выражений (expression category) и классом памяти объектов (object storage duration). Не поделишься рассужедениями, как ты пришел к такому выводу?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 26.12.18 18:56
Оценка:
Здравствуйте, rg45, Вы писали:

R>Судя по всему, тебе удалось установить прямую причинно-следственную связь между категориями выражений (expression category) и классом памяти объектов (object storage duration). Не поделишься рассужедениями, как ты пришел к такому выводу?


Нет, не удалось. Это все таки больше вопрос был. Просто я не встречал примеров в которых бы std::move применялся для объекта в динамической памяти:
X* x = new X();
std::move(*x);


Ну вот например в C# нет объектов на стеке, насколько я знаю. Пригодилась бы в C# move-семантика?
Re[3]: Value category и объекты в динамической памяти
От: rg45 СССР  
Дата: 26.12.18 19:01
Оценка: 2 (1) +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Ну вот например в C# нет объектов на стеке, насколько я знаю.


Плохо знаешь: https://metanit.com/sharp/tutorial/2.16.php
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 26.12.18 19:28
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Максим Рогожин, Вы писали:


МР>>Ну вот например в C# нет объектов на стеке, насколько я знаю.


R>Плохо знаешь: https://metanit.com/sharp/tutorial/2.16.php


Спасибо. Просмотрел. Т.е. используя struct вместо class мы получаем хранение и передачу объектов как в C++?
Re[5]: Value category и объекты в динамической памяти
От: rg45 СССР  
Дата: 26.12.18 19:42
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Спасибо. Просмотрел. Т.е. используя struct вместо class мы получаем хранение и передачу объектов как в C++?


В C++ для одних и тех же типов могут использоваться различные способы хранения, точнее классы памяти (storage duration). Поэтому правильнее будет сказать, что хранение типов-значений в C# такое же, как у объектов с автоматическим классом памяти (automatic storage duration) в С++. Передача объектов типов-значений в функции может осуществляться одним из трех способов, в зависимости от объявления формальных параметров: 1) по значению (по умолчанию); 2) по ссылке (модификатор ref); 3) как выходной параметр (модификатор out). Так что, все не так однозначно (с).
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.12.2018 19:44 rg45 . Предыдущая версия . Еще …
Отредактировано 26.12.2018 19:43 rg45 . Предыдущая версия .
Re[6]: Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 26.12.18 19:52
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Максим Рогожин, Вы писали:


МР>>Спасибо. Просмотрел. Т.е. используя struct вместо class мы получаем хранение и передачу объектов как в C++?


R>В C++ для одних и тех же типов могут использоваться различные способы хранения, точнее классы памяти (storage duration). Поэтому правильнее будет сказать, что хранение типов-значений в C# такое же, как у объектов с автоматическим классом памяти (automatic storage duration) в С++. Передача объектов типов-значений в функции может осуществляться одним из трех способов, в зависимости от объявления формальных параметров: 1) по значению (по умолчанию); 2) по ссылке (модификатор ref); 3) как выходной параметр (модификатор out). Так что, все не так однозначно (с).


Понятно. А move-семантика в C++ все таки применяется для объектов хранящихся в динамической памяти? Если объект в динамической памяти, то проще указатель на него присвоить другому указателю, чем move-конструктор вызывать, поэтому кажется что move-семантика все же для объектов с автоматическим классом памяти.
Re[7]: Value category и объекты в динамической памяти
От: rg45 СССР  
Дата: 26.12.18 20:10
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Понятно. А move-семантика в C++ все таки применяется для объектов хранящихся в динамической памяти? Если объект в динамической памяти, то проще указатель на него присвоить другому указателю, чем move-конструктор вызывать, поэтому кажется что move-семантика все же для объектов с автоматическим классом памяти.


С практической точки зрения мне действетельно трудно сходу придумать случай, когда было бы полезно переместить объект, находящийся в динамической памяти, вместо того, чтоб переместить/скопировать указатель. Но это не значит, что таких случаев не бывает. Например может понадобиться переместить объект между умными указателями разных типов, или из-под умного указателя в "стек" (automatic storage duration). Чисто технически, move-семантика в равной степени применима ко всем объектам, независимо от их классов памяти.

Хотя, вот, например, вполне реалистичный сценарий: присваивание элементу вектора значения, сформированного в автоматической или временной области памяти с использованием перемещающего оператора присваивания. Очень часто, работая с такими типами как std::string, std::vector, etc, мы думаем о них как о типах-значениях, размещающихся "на стеке", забывая о том, что на самом деле они используют динамическую память.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.12.2018 20:20 rg45 . Предыдущая версия .
Re: Value category и объекты в динамической памяти
От: B0FEE664  
Дата: 02.01.19 14:25
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Правильно я понимаю, что value category (lvalue, rvalue, xvalue, prvalue) имеет смысл только для языков, в которых имеется возможность создавать объекты на стеке и возвращать их через стек?


Реализация языка С++ не обязана иметь стек и создавать объекты на стеке. Например, С++ код может компилироваться в джаваскрипт и исполнятся не нарушая стандарта С++.
И каждый день — без права на ошибку...
Re[2]: Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 02.01.19 19:40
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке.


А подтверждение этому есть какое-нибудь?
Re[3]: Value category и объекты в динамической памяти
От: andrey.desman  
Дата: 02.01.19 21:22
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

BFE>>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке.

МР>А подтверждение этому есть какое-нибудь?

Зачем подтверждение? Теория фальсифицируема, достаточно одного контраргумента.
Поищи слово "стек" в стандарте.
В c++ есть понятие storage duration (static, automatic, dynamic), но нет кучи и стека. Никто не обязывает компилятор выделять память для автоматических объектов на каком-то там стеке. Главное, чтобы эти объекты прихлопнули по выходу из области видимости.
Re[3]: Value category и объекты в динамической памяти
От: B0FEE664  
Дата: 02.01.19 22:10
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

BFE>>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке.

МР>А подтверждение этому есть какое-нибудь?

Есть:

4.1.1 Abstract machine [intro.abstract]
1 The semantic descriptions in this document define a parameterized nondeterministic abstract machine. This
document places no requirement on the structure of conforming implementations. In particular, they need
not copy or emulate the structure of the abstract machine. Rather, conforming implementations are required
to emulate (only) the observable behavior of the abstract machine as explained below.4


4) This provision is sometimes called the “as-if” rule, because an implementation is free to disregard any requirement of this
document as long as the result is as if the requirement had been obeyed, as far as can be determined from the observable
behavior of the program. For instance, an actual implementation need not evaluate part of an expression if it can deduce that
its value is not used and that no side effects affecting the observable behavior of the program are produced.

И каждый день — без права на ошибку...
Re[4]: Value category и объекты в динамической памяти
От: σ  
Дата: 03.01.19 00:05
Оценка: 2 (1)
BFE>>>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке.
МР>>А подтверждение этому есть какое-нибудь?

AD>Зачем подтверждение? Теория фальсифицируема, достаточно одного контраргумента.

AD>Поищи слово "стек" в стандарте.

Там есть "stack unwinding" https://timsong-cpp.github.io/cppwp/n4659/except.ctor#def:stack_unwinding
Происхождение названия этого термина понятно.
Но, конечно, будет некорректным выдирать из целого термина одно слово "stack" и делать из этого выводы типа предположения наличия стека.
Этот термин неделим и просто обозначает процесс разрушения определённых объектов в порядке обратном из конструкции при выбрасывании исключения.
Можно любые вхождения термина "stack unwinding" в стандарте заменить на, допустим, UUID или на словосочетание "yellow potato". С формальной точки зрения разницы не будет.
Re[2]: Value category и объекты в динамической памяти
От: Максим Рогожин Россия  
Дата: 03.01.19 16:05
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке. Например, С++ код может компилироваться в джаваскрипт и исполнятся не нарушая стандарта С++.


А в джаваскрипте что стека нет? А где создаются automatic объекты тогда?
Re[3]: Value category и объекты в динамической памяти
От: B0FEE664  
Дата: 03.01.19 16:22
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

BFE>>Реализация языка С++ не обязана иметь стек и создавать объекты на стеке. Например, С++ код может компилироваться в джаваскрипт и исполнятся не нарушая стандарта С++.

МР>А в джаваскрипте что стека нет? А где создаются automatic объекты тогда?

Я не знаю точно, как сделан джаваскрипт, но утечку памяти в некоторых реализациях я наблюдал. Может там есть стек, а может и нет, суть не в этом, а в том, что реализация C++ может не иметь стека или иметь несколько стеков или иметь стек, но складывать в него только некоторые переменные...
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.