Size: a a a

Rust — русскоговорящее сообществo

2020 October 17

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Emmanuel Goldstein
В C/++ — один файл.
*плюс-минус заголовочники, some terms and conditions may apply
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Как будто в крестах никто не делает шаблоны тройной вложенности и магию на мета-уровне)
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
В крестах это делать сложнее (темплейты вообще сложнее дженериков)
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
sccache, с другой стороны, правда спасает. В плюсах централизованно закешировать зависимости это нетривиальная задача (если ты только не пользуешься для этой цели системным пакетным менеджером)
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
polunin.ai
Как будто в крестах никто не делает шаблоны тройной вложенности и магию на мета-уровне)
+
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Emmanuel Goldstein
В крестах это делать сложнее (темплейты вообще сложнее дженериков)
enable_if и куча "интерфейсов" вошли в чат
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Эрик
На что ты возвращаешь указатель?
на объект, созданный в анриале. Это просто для адресации. У анриала свой GC, но он подчиняется расту и это раст скажет, когда надо удалить этот объект.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
вафель 🧇
Option<*const> состоит из 8 байтов указателя + 1 байт тэг, по скольку размер должен быть кратным выравниванию (а оно у *const  — 8) то размер становится 16 байтов, все логично.

Чтобы сработала оптимизация тэга, нужна дырка в указателе (NonNull)
вот странно. По-логике, указатели всегда NonNull, и в коде c_void об этом сказано.. И как же мне сделать Option c нулевым указателем? Я плохо помню, но кажись Option<*mut()> 8 байт, но это уже не c_void. Да и вообще хз зачем c_void.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Anton TrionProg
вот странно. По-логике, указатели всегда NonNull, и в коде c_void об этом сказано.. И как же мне сделать Option c нулевым указателем? Я плохо помню, но кажись Option<*mut()> 8 байт, но это уже не c_void. Да и вообще хз зачем c_void.
С чего бы указателям быть всегда NonNull?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Anton TrionProg
вот странно. По-логике, указатели всегда NonNull, и в коде c_void об этом сказано.. И как же мне сделать Option c нулевым указателем? Я плохо помню, но кажись Option<*mut()> 8 байт, но это уже не c_void. Да и вообще хз зачем c_void.
Option<NonNull<c_void>> 8 байт
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
А обычный указатель спокойно может быть нулевым, например см. std::ptr::null()
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Mikail Bagishov
Option<NonNull<c_void>> 8 байт
Аккуратно, NonNull включает covariance, это может быть не то, что ты хочешь.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Попробовал "ночью для себя, а утром для вас" вызвать растом функцию на С и cdecl, и vectorcall и win64, и в С прописал __vectorcall и подобное. Всё равно кракозябры возвращаются. Придётся временно откатиться в самое начало, написать код заново(вдруг там ошибки) и попробовать. Должно ж по логике получиться. Займусь ночью.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mikail Bagishov
Option<NonNull<c_void>> 8 байт
хм, т.е. NotNull<c_void> а не NotNull< *mut c_void > ?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Anton TrionProg
хм, т.е. NotNull<c_void> а не NotNull< *mut c_void > ?
Да
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
NonNull уже подразумевает поинтер
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Anton TrionProg
хм, т.е. NotNull<c_void> а не NotNull< *mut c_void > ?
Да.
NonNull<*c_void>
Это ненулевой указатель на указатель на void
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mikail Bagishov
Да.
NonNull<*c_void>
Это ненулевой указатель на указатель на void
А, понял, это подобно моему OptionPtr на расте. Ну вы поняли, что это =)) Правда нет ромального паттерн-матчинга и я пишу if (auto object = ptr.match()) {..} else {..}
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Аккуратно, NonNull включает covariance, это может быть не то, что ты хочешь.
кстати, что значит covariant?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Anton TrionProg
кстати, что значит covariant?
Номикон объяснит лучше, чем я
https://doc.rust-lang.org/nomicon/subtyping.html
источник