Подтвердить что ты не робот

Почему у Rust нет союзов?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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


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

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