Size: a a a

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

2020 August 23

Э

Эрик in Rust — русскоговорящее сообществo
Ну такое.
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Так моя структура вряд ли будет в массиве
Это не важно, у нее должен быть размер такой, чтобы она могла быть в массиве и при этом все поля были бы с заданным выравниванием, а индексация проходила по тупому i*size_of_struct (Это про обычные структуры и их паддинг).
Лейаут конечно паддинг включать не будет без необходимости, так как расчет на то, что массив ты тоже будешь через лайаут делать, и только в этом случае он должен будет добавиться.
источник

V

Vladimir in Rust — русскоговорящее сообществo
Эрик
Да, но обычно аллокатор подъедает, не?
а аллокатор тут не причем, он может жрать сколько ему вздумается. Обычно в аллокаторах есть набор оптимизаций, который делит память на чанки, и выделяет их, даже если используется только часть.
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
Это не важно, у нее должен быть размер такой, чтобы она могла быть в массиве и при этом все поля были бы с заданным выравниванием, а индексация проходила по тупому i*size_of_struct (Это про обычные структуры и их паддинг).
Лейаут конечно паддинг включать не будет без необходимости, так как расчет на то, что массив ты тоже будешь через лайаут делать, и только в этом случае он должен будет добавиться.
Она в принципе не может быть в массиве, ?Sized же...
источник

V

Vladimir in Rust — русскоговорящее сообществo
Вафель
Она в принципе не может быть в массиве, ?Sized же...
А как это мешает?
источник

V

Vladimir in Rust — русскоговорящее сообществo
Т.е. да, в расте нельзя сделать [T:!Sized; 12] но ты же аллоцируешь ручками, кто мешает тебе делать
let array = full.clone().extend(full); и так до нужного размера массива
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=86e936fdb04f05b40e84ad576478a1d2
источник

В

Вафель in Rust — русскоговорящее сообществo
Vladimir
Т.е. да, в расте нельзя сделать [T:!Sized; 12] но ты же аллоцируешь ручками, кто мешает тебе делать
let array = full.clone().extend(full); и так до нужного размера массива
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=86e936fdb04f05b40e84ad576478a1d2
Да, но я точно так-же ко всему могу добавить отдельный u8/u16/etc и это не потребует округления до 32
источник

В

Вафель in Rust — русскоговорящее сообществo
Не получается использовать ручную аллокацию, miri ругается: error: Undefined Behavior: memory access failed: pointer must be in-bounds at offset 6, but is outside bounds of alloc2190 which has size 5

Совершенно не понимаю что именно не так
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8a83c0cb9b90853212bcca105903a9b2
источник

В

Вафель in Rust — русскоговорящее сообществo
После замены u16 на [u8; 2] мири не ругается, так что возможно что-то с aligment'ом не так, хотя странно
источник

Э

Эрик in Rust — русскоговорящее сообществo
Очевидно, что указатель на твою структуру не совпадает с Box.
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Очевидно, что указатель на твою структуру не совпадает с Box.
неочевидно. ошибку можно и без box воспроизвести
источник

Ct

Casual tears in Rust — русскоговорящее сообществo
Вафель
Не получается использовать ручную аллокацию, miri ругается: error: Undefined Behavior: memory access failed: pointer must be in-bounds at offset 6, but is outside bounds of alloc2190 which has size 5

Совершенно не понимаю что именно не так
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8a83c0cb9b90853212bcca105903a9b2
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7797e3ccd3ccaf295274c18c6836376b
Добавление pad_to_align волшебным образом проблему решает
источник

В

Вафель in Rust — русскоговорящее сообществo
Спасибо, пошёл курить доку....
источник

Э

Эрик in Rust — русскоговорящее сообществo
Это из-за repr(C).
источник

Ct

Casual tears in Rust — русскоговорящее сообществo
Вафель
Спасибо, пошёл курить доку....
https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
В extend описано, что надо pad_to_align вызывать
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Это из-за repr(C).
(нет)
источник

В

Вафель in Rust — русскоговорящее сообществo
Действительно, пропустил это.
источник

Э

Эрик in Rust — русскоговорящее сообществo
источник

В

Вафель in Rust — русскоговорящее сообществo
Тем не менее без repr(c) miri выдаёт ту же ошибку
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Без #[repr(C)] ты ж вообще не имеешь права ничего предполагать про память, не?
источник