2015-03-25 5 views
18

Я могу думать о многих местах, где полезны союзы в помощи C, и они экономят память. Поскольку Rust является языком системного программирования, почему он не поддерживает профсоюзы?Почему у Rust нет союзов?

ответ

29

Были добавлены союзы на языке (RFC 1444), и они стабильны с Rust 1.19.0. Они требуют использования блоков unsafe.

Необработанные соединения не являются безопасными для памяти (так как компилятор не может гарантировать, что вы всегда читаете правильный тип (то есть самый недавно написанный тип) из объединения). Одной из целей Rust является создание низкоуровневого языка с безопасностью памяти; поскольку профсоюзы не совместимы с этой целью, они не были включены в Rust 1.0.

Вместо этого у Rust есть enums, которые обеспечивают большинство преимуществ профсоюзов в обмен на небольшое использование памяти, но которые безопасны в памяти, поскольку значение перечисления всегда отслеживает, какой конкретный тип он содержит.

+1

Фактически он [разработан в настоящий момент] (https://github.com/rust-lang/rust/pull/36016), для совместимости с внешним C. – snuk182

21

ржавчина помечено профсоюзам в форме ее алгебраических типов данных, enum:

enum Foo { 
    Bar(i32), 
    Baz, 
    Quux { 
     misc: A, 
     ellaneous: B, 
     fields: C, 
    }, 
} 

Foo может быть либо Bar с прикрепленным i32, A Baz без каких-либо дополнительных данных или Quux с этими тремя разными областями. Это меченый союз - размер перечисления не будет превышать самый большой из его вариантов плюс столько, сколько необходимо для тега (обычно один байт, но я думаю, что возможно иметь больше вариантов, чем в одном байте), и в некоторых случаях, когда он может быть оптимизирован (например, Option<&T>, где адрес памяти 0 не является законным для варианта Some и поэтому может быть использован для представления варианта None), вариант сжимается в значение.


Что Rust делает не есть, немаркированные союзы как в C. Почему? Потому что они принципиально небезопасны, и безопасность важна для Rust. Если вы все еще хотите что-то подобное, вполне возможно создать обертку вокруг небезопасного кода, с которым вы столкнетесь, с такими вещами, как трансмутация, но вам просто не нужны немаркированные союзы в нормальной жизни.

Rust теперь поддерживает немаркированные союзы как небезопасную концепцию; as of 1.19.0.

+3

Тег может быть больше одного байта, даже если у вас есть только два варианта (например, 'enum X {S (i32), U (u32)}' - восемь байтов) из-за выравнивания. Технически это один байт с заполнением тремя байтами, но конечный результат тот же. – delnan

Смежные вопросы