Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rust ↔ C++

АспектRustC++
Тривиальная перемещаемость (trivial relocatability)Все перемещения — это memcpyСамоссылающиеся типы; конструкторы перемещения могут иметь побочные эффекты
Безопасность уничтоженияDrop::drop() только в исходном местеДеструктор может выполняться для объектов, из которых уже выполнено перемещение
Безопасность исключенийПаники (abort или unwind)Исключения (unwind)
Стабильность ABIЯвно нестабиленЗависит от поставщика

Даже если бы удалось обойтись взаимодействием через C, некоторые области языков всё равно влияют на FFI:

Тривиальная перемещаемость

На стороне Rust нельзя безопасно перемещать объекты C++; их нужно закреплять (pin) или хранить в куче C++.

В Rust перемещение объектов, которое происходит при присваивании или передаче по значению, всегда копирует значения побитово.

C++ позволяет пользователям задавать собственную семантику: они могут перегружать оператор присваивания и создавать конструкторы перемещения и копирования.

Это влияет на взаимодействие, потому что самоссылающиеся типы становятся естественными в высокопроизводительном C++. Собственные конструкторы могут поддерживать инварианты безопасности, даже когда объект меняет своё положение в памяти.

Объекты с той же семантикой невозможно определить в Rust.

Безопасность уничтожения

Семантика объектов C++, из которых выполнено перемещение, не соответствует Rust; нужно не допустить, чтобы Rust «перемещал» типы C++.

Безопасность исключений

Ни одно из них не может безопасно пересекать границу другого; оба должны перехватывать исключения на границе.