Я пытаюсь прочитать документ веб-сборки и вижу, что он упоминает только поддержку типов i32, i64, f32, f64
Но я не могу найти места, где упоминается составной тип, такой как struct
Это невозможно изначально в веб-сборке? Как обходной путь компилятора C для структуры размером более 64 бит? Как я могу упаковать в стек 2 числа с плавающей запятой и 2 целых?
Для композиций размером до 8 байт вы можете упаковать их в 64-битное целое число.
Для более крупных структур вам необходимо передать их через линейную память или набор изменяемых глобальных объектов.
Множественные возвращаемые значения определенно все еще находятся в поле зрения, и я намерен
очень скоро напишу предложение. Тем не менее, они не дают вам структур
напрямую, вам все равно придется разделить их на отдельные значения для
все остальное, кроме вызовов функций.
@ rossberg-chromium Большое спасибо. Я думаю, что если он не ограничивает размер и порядок этих возвращаемых значений, мы могли бы обходиться с помощью поддельной структуры на скомпилированном языке. Этого должно быть достаточно
А пока структуры можно реализовать с помощью указателей, верно?
Просто разместите свою структуру в линейной памяти и работайте с указателями.
@nidin Спасибо. Это обычный способ компиляции структуры C в wasm?
@rossberg есть ли обновления по поддержке структуры?
@krisnye , нет планов по поддержке структуры для программ wasm, использующих линейную память; компилятор должен понижать структуры и операции структуры до примитивных операций. Есть некоторые планы для структурных типов в контексте предложения о поддержке сборщика мусора, не использующих линейную память, см., Например, https://github.com/WebAssembly/gc. В Firefox Nightly есть экспериментальная поддержка по крайней мере для части из них, см. Https://github.com/lars-t-hansen/moz-gc-experiments.
Самый полезный комментарий
Множественные возвращаемые значения определенно все еще находятся в поле зрения, и я намерен
очень скоро напишу предложение. Тем не менее, они не дают вам структур
напрямую, вам все равно придется разделить их на отдельные значения для
все остальное, кроме вызовов функций.