Size: a a a

2021 March 03

M(

MIT/Yardanico (alt) in ru.nim.talks
Потому что у них есть nil
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
И options этот факт использует
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
MIT/Yardanico (alt)
Для ref'ов будет их же размер
Ну ещё для ptr, pointer, proc
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
Все это ссылки
источник

M(

MIT/Yardanico (alt) in ru.nim.talks
источник

f

for(int c; (c = getc... in ru.nim.talks
Можно попробовать написать свой option которые при помощи when и прочего ада будет определять будет ли 'пустое' свободное место которое можно использовать, и затем использовать ветку объекта где стоит packed поле, а в противном случае использовать обычное.

Примерно тоже самое что делает раст для  своих option типов
источник

G

Gabben in ru.nim.talks
for(int c; (c = getchar()) != EOF;)
Можно попробовать написать свой option которые при помощи when и прочего ада будет определять будет ли 'пустое' свободное место которое можно использовать, и затем использовать ветку объекта где стоит packed поле, а в противном случае использовать обычное.

Примерно тоже самое что делает раст для  своих option типов
Не совсем понял. Насколько я помню, в расте эта оптимизация убирает место занимаемое дискриминатором, потому что компилятор знает, что все ссылки не нулейбл
источник

f

for(int c; (c = getc... in ru.nim.talks
import std/options

type
 OptPacked[T] {.packed.} = object
   value: T
   has: bool
 
 OptBase[T] = object
   value: T
   has: bool
 
 Opt[T] = object
   when sizeof(T) mod 2 == 0:
     impl: OptPacked[T]
   
   else:
     impl: OptBase[T]
     
     
echo sizeof(OptPacked[int])
echo sizeof(Opt[int])
echo sizeof(Option[int])

echo sizeof(Opt[uint16])
echo sizeof(Option[uint16])

echo sizeof(Opt[uint32])
echo sizeof(Option[uint32])
источник

f

for(int c; (c = getc... in ru.nim.talks
Ну примерно такой костыль
источник

VB

Vladimir Berezenko in ru.nim.talks
ыыыыыыыыыы
источник

VB

Vladimir Berezenko in ru.nim.talks
там всё has ломает
источник

VB

Vladimir Berezenko in ru.nim.talks
там надо when sizeof(T) mod 2 != 0 и тогда будет лучше :)
источник

f

for(int c; (c = getc... in ru.nim.talks
ну это код-из-пещеры в любом случае, я не то чтобы особенно хорошо разобрался как там это все точно оптимизировать надо
источник

f

for(int c; (c = getc... in ru.nim.talks
Gabben
Не совсем понял. Насколько я помню, в расте эта оптимизация убирает место занимаемое дискриминатором, потому что компилятор знает, что все ссылки не нулейбл
источник

f

for(int c; (c = getc... in ru.nim.talks
Я имел ввиду это, но опять же, я не разбирался подробоно, просто мне показалась что общая идея похожа
источник

VB

Vladimir Berezenko in ru.nim.talks
если некратно 2 то бул дополнит до 2
источник

G

Gabben in ru.nim.talks
Спасибо
источник

KD

Kitsune Digital in ru.nim.talks
Vladimir Berezenko
поэтому { int, char, int, char} будет больше по размеру чем {int, char, char, int}
есть какая-то прагма чтоб оно перетасовывало усе поля по размеру с целью уменьшения общего занимаемого места?
источник

VB

Vladimir Berezenko in ru.nim.talks
нет. это невозможно с точки зрения самого языка.
источник

KD

Kitsune Digital in ru.nim.talks
а хуле?
источник