@dlangru

Страница 608 из 719
Ievgenii
20.06.2018
06:30:33
Сори!

NullSanya
20.06.2018
06:31:24
Да, User Defined Attributes
Ими могут быть структуры и енумы любые, вытаскивать их надо самому через std.traits

мог напутать

Ievgenii
20.06.2018
06:31:44
мог напутать
Все верно

Google
Ievgenii
20.06.2018
06:31:49
Могут быть еще простые строки

Типа: @ForMyDad

И проверяй на наличие такого атрибута

NullSanya
20.06.2018
06:32:24
Мне не нравится такой подход

Ievgenii
20.06.2018
06:32:34
Весьма забавная штука. Ява вся пронизана этим...

NullSanya
20.06.2018
06:32:54
Чем?
Строки не автокомплитятся.

Ievgenii
20.06.2018
06:33:40
Да)
Зато дает много возможностей!

Google
NullSanya
20.06.2018
06:33:48
Dark
20.06.2018
06:34:52
Ими могут быть структуры и енумы любые, вытаскивать их надо самому через std.traits
С енумом берётся значение енума в качестве атрибута, как проверить его я так и не понял. Поэтому и спросил. Кроме того, непонятно, как добиться того, что бы атрибут можно было использовать и с параметрами и без

Maxim
20.06.2018
06:36:05
для полноты картины нужно сказать, что File — это не дескриптор, а структура-обертка над сишным вводом-выводом

и там уже внутри лежит дескриптор, который является просто числом)

Dmitry
20.06.2018
06:36:40
Если ты напишешь new File(...), то это ты разместишь дискриптор в куче
Ну а где на него будет ссылка храниться? Как я понимаю стек это просто указатель на объекты в куче и изредка может использоваться как хранилище когда что то мелкое

Valeriy
20.06.2018
06:38:43
UDA — это интроспекция времени компиляции. В перспективе мощьная штука. Пок ане довелось попробовать

Ievgenii
20.06.2018
06:38:47
Это в куче

File test(string name) { return File(name, "r"); } test1 = test("/tmp/t.txt");

А это, по идее, ошибка

NullSanya
20.06.2018
06:39:10
Valeriy
20.06.2018
06:39:34
Тут разве не File* возвращается?
Там нет кучи, вы чё. File — структура. На стеке создаётся

Dark
20.06.2018
06:39:39
Давай пример, не совсем понятно
enum long test = 0; struct test2 { @test bool prop; } Когда я получаю атрибуты prop, у меня вместо test - 0. И тип long. Второй момент. Я хочу как то так struct t { @test @test(someString) string prop;

Google
Maxim
20.06.2018
06:40:02
Посоветуй чем нагляднее
я обычно objdump для этих целей использую

Ievgenii
20.06.2018
06:40:08
Там нет кучи, вы чё. File — структура. На стеке создаётся
Если ты не используешь конструкцию new

Valeriy
20.06.2018
06:40:35
Если ты не используешь конструкцию new
Ну да, если new, то самом собой в куче

Maxim
20.06.2018
06:41:32
ну и, соответственно, адрес будет храниться на стеке, хотя, наверное, может и в регистре каком-нибудь лежать

Ievgenii
20.06.2018
06:41:47
Ну а где на него будет ссылка храниться? Как я понимаю стек это просто указатель на объекты в куче и изредка может использоваться как хранилище когда что то мелкое
Все то, что ты собираешься возвращать из функции, или просто должно жить при выходе из функции, должно быть созданно в куче, остальное, для быстроты, должно быть созданно на стеке.

Valeriy
20.06.2018
06:42:34
Компилятор знает возвращаемый тип и резервирует место на стеке

Valeriy
20.06.2018
06:43:06
А ещё есть такая штука, как RVO,

Valeriy
20.06.2018
06:43:31
Нет
Да

Dark
20.06.2018
06:43:31
Ievgenii
20.06.2018
06:43:38
То что возвращается может и на стеке быть размещено
Если ты создаш на стеке - он будет удалено при выходе из функции

Вот я спрашиваю, как?
https://dlang.org/phobos/std_traits.html#getUDAs

Maxim
20.06.2018
06:44:07
Нет
более того, может храниться и в регистре, зависит всё от calling convertion

Ievgenii
20.06.2018
06:44:17
struct AttrT(T) { string name; T value; } @AttrT!uint("Answer", 42) @AttrT!int("Pi", 3) @AttrT int d; static assert(getUDAs!(d, AttrT).length == 2); static assert(getUDAs!(d, AttrT)[0].name == "Answer"); static assert(getUDAs!(d, AttrT)[0].value == 42); static assert(getUDAs!(d, AttrT)[1].name == "Pi"); static assert(getUDAs!(d, AttrT)[1].value == 3); static assert(getUDAs!(d, AttrT!uint).length == 1); static assert(getUDAs!(d, AttrT!uint)[0].name == "Answer"); static assert(getUDAs!(d, AttrT!uint)[0].value == 42); static assert(getUDAs!(d, AttrT!int).length == 1); static assert(getUDAs!(d, AttrT!int)[0].name == "Pi"); static assert(getUDAs!(d, AttrT!int)[0].value == 3);

Ievgenii
20.06.2018
06:45:37
Это не относится к возвращаемому значению
При возврате будет копирование

Google
Valeriy
20.06.2018
06:45:55
Только к тому что определено внутри тела функции. Возвращаемое значение, то что полсе return размещается на стеке вызывающего скопа

При возврате будет копирование
Да нет же я тебе говорю. Дичь пишешь

Maxim
20.06.2018
06:46:47
https://dlang.org/spec/abi.html#return_value

Valeriy
20.06.2018
06:46:54
Для этого и нужна статическая типизация, что такие оптимизации они элементарно делаются

Maxim
20.06.2018
06:48:01
такие дела, практически всё возвращается в регистрах)

Ievgenii
20.06.2018
06:49:07
Valeriy
20.06.2018
06:49:56
https://run.dlang.io/is/HSfSml
Мы же про возвращаемое значение говорили?

Ievgenii
20.06.2018
06:50:09
Да нет же я тебе говорю. Дичь пишешь
Создаем на стеке, после запоминаем ссылку на объект, а после снова попадаем в этот метод и создаем на стеке, глобальный объект переписан

Valeriy
20.06.2018
06:50:15
У тебя там void — тип возвращаемого значения

Ievgenii
20.06.2018
06:50:36
Мы же про возвращаемое значение говорили?
Цитата: " или просто должно жить при выходе из функции"

Admin
ERROR: S client not available

Ievgenii
20.06.2018
06:50:52
Мы же про возвращаемое значение говорили?
При return - да, он просто будет копировать

И это факт

Структуры ВСЕГДА копируются

Если ты их не возвращаешь по указателю или с ref

Объекты классов - всегда возвращаются по ссылке

Ну или указатель фигаш на них...

Если в функции ты создаешь структуру, а после возвращаешь эту структуру - при возврате будет копирование структуры!

Чуть напутал, при возврате компилятор оптимизирует и не создает копию структуры. Он при входе в функцию создает копию

Google
Ievgenii
20.06.2018
06:57:12
https://run.dlang.io/is/zuA9sl

Ievgenii
20.06.2018
07:00:46
Вот я спрашиваю, как?
Это очень удобная вещь, когда ты хочешь к некой сущности добавить мета информацию, без хранения ее в самом поле

https://run.dlang.io/is/cLND0o
Чуть напутал, при возврате компилятор оптимизирует и не создает копию структуры. Он при входе в функцию создает копию

Valeriy
20.06.2018
07:02:32
Вот я спрашиваю, как?
У @deviator были на хабре статьи про UDA https://habr.com/post/261349/ https://habr.com/post/261641/

Ievgenii
20.06.2018
07:09:31
При входе может и создать. Там разные варианты. Да.
А вот если не присвоить в переменную результат возврата функции - то структура будет удалена сразу, но уже после, выхода из функции

Не ожидая очистки стека вызываемой функции

Dark
20.06.2018
07:11:48
Ievgenii
20.06.2018
07:12:15
UDA там лишь слегка затрагивается
Так пример из мануала полностью описывает твой пример

Или что-то не выходит?

Dark
20.06.2018
07:12:55
Так пример из мануала полностью описывает твой пример
Не полностью. @AttrT!uint("Answer", 42) @AttrT!int("Pi", 3) @AttrT int d; static assert(getUDAs!(d, AttrT).length == 2); static assert(getUDAs!(d, AttrT)[0].name == "Answer"); static assert(getUDAs!(d, AttrT)[0].value == 42); static assert(getUDAs!(d, AttrT)[1].name == "Pi"); static assert(getUDAs!(d, AttrT)[1].value == 3);

3ий атрибут не виден

Ievgenii
20.06.2018
07:39:40
3ий атрибут не виден
Виден: https://run.dlang.io/is/uNRFWQ

Dark
20.06.2018
07:42:09
Виден: https://run.dlang.io/is/uNRFWQ
А если струтура-темплейт, то нет. Хм. Ну ладно

Ievgenii
20.06.2018
07:48:33
Dark
20.06.2018
07:49:12
https://run.dlang.io/is/lwXz0M
Имеется ввиду @Data

Ievgenii
20.06.2018
07:49:33
Так я же тебе сделал ее структурой

Не понимаю

Dark
20.06.2018
07:50:35
struct Data(T) { } @Data Data!int int some; getUDAs(some, Data).length; // => 1

Ievgenii
20.06.2018
07:51:55
struct Data(T) { } @Data Data!int int some; getUDAs(some, Data).length; // => 1
Это то, что ты хочешь получить?

Страница 608 из 719