LINUX.ORG.RU

Rust, rlib и строки

 , , , ,


1

5

1. Rlib из 100кб разбух до 3.1мб. Rlib - динамическая библиотека с растовским ABI, так ведь?
2. Можно динамически слинковаться с rlib?
3. Какие преобразования строки будут при передаче ее по указателю в растовскую функцию через ffi динамической библиотеки с возвратом указателя модифицированной строки?


Какие преобразования строки будут при передаче ее по указателю в растовскую функцию через ffi динамической библиотеки с возвратом указателя модифицированной строки?

никакие

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

А если вызывается сишная функция? Ffi же использует C ABI, а значит растовские строки должны стать сишными, т.е. растовская строка перед отправкой в ffi функцию должна стать сишной, из функции мы получаем обратно измененную сишную ffi строку, преобразуем её в растовскую и используем дальше по коду, разве нет?

hivod
() автор топика
Ответ на: комментарий от hivod

т.е. растовская строка перед отправкой в ffi функцию должна стать сишной,

Для «оправки в ffi» нужно всего-лишь взять готовый указатель и отдать. В rust строки используют utf-8, т.е. по сути char*.

anonymous
()

1. ... Rlib - динамическая библиотека с растовским ABI, так ведь?

https://doc.rust-lang.org/rustc/metadata/loader

An rlib is a rustc-defined file format (currently just an ar archive)

2. Можно динамически слинковаться с rlib?

Таки нужна динамическая библиотека, чего-то в этом духе:

// treble.rs - a rust library for tripling numbers.

#![crate_type = "dylib"]

#[no_mangle]
pub extern fn treble(value: i32) -> i32 {
    value * 3
}

Compile this using:

$ rustc treble.rs
$ ls
libtreble.so  treble.rs

libtreble.so is our shared library file, which we can use from non-Rust programs.

(http://harkablog.com/calling-rust-from-c-and-python.html)

ozkriff
()
Ответ на: комментарий от anonymous

Не совсем - в rust строки не нуль-терминированные.

O02eg ★★★★★
()
Ответ на: комментарий от ozkriff

В библиотеке одна функция возвращает число, бинарник печатает его в терминал. При статической линковке бинарник занимает 8.9КБ, а если динамически: бинарник 2.8МБ, библиотека 2.9МБ. Можно понизить прожорливость?

hivod
() автор топика

Rlib из 100кб разбух до 3.1мб.

Rustишка!

Pavval ★★★★★
()
Ответ на: комментарий от hivod

... При статической линковке бинарник занимает 8.9КБ, а если динамически: бинарник 2.8МБ, библиотека 2.9МБ. Можно понизить прожорливость?

http://stackoverflow.com/questions/29008127/why-are-rust-executables-so-huge

$ rustc treble.rs    
$ ls -lh libtreble.so
-rwxrwxr-x 1 ozkriff ozkriff 2,7M июля  29 15:37 libtreble.so
$ rustc -C prefer-dynamic treble.rs
$ ls -lh libtreble.so              
-rwxrwxr-x 1 ozkriff ozkriff 9,7K июля  29 15:37 libtreble.so
$ 
ozkriff
()
Последнее исправление: ozkriff (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

а почему нет?

Например потому, что в функцию, ожидающую str, нельзя передать *mut u8. Только копировать данные при каждом вызове.

monk ★★★★★
()
Ответ на: комментарий от monk

Например потому, что в функцию, ожидающую str, нельзя передать *mut u8

str - это еще не синоним слова «строка»

rust тем и фичаст, что ownership - концепция сугубо добровольная, хоть и дефолтная

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

а почему нет?
str - это еще не синоним слова «строка»

Вопрос терминологии. В каком-то смысле указатель на массив байт, конечно, является строкой. Но ни в официальной документации ржавчины, ни в сообществе, вроде, строкой это не называют. Есть «byte string», но это ж не просто «строка».

Просто если человек спрашивает «какие преобразования строки будут при передаче ее по указателю в растовскую функцию через ffi..?» то, в случае ржавчины, имхо, по-умолчанию подразумевается str/String и для них таки преобразования будут.

ozkriff
()
Ответ на: комментарий от MyTrooName

Владеющая строка - String, невладеющая - str, больше растовых строк нет.

O02eg ★★★★★
()
Ответ на: комментарий от ozkriff

Вопрос терминологии

в общем, да.

хотя я, похоже, неправильно понял не термин растовская строка, а модальность исходного вопроса:

Какие преобразования строки будут при передаче ее по указателю

vs

Какие преобразования строки должны быть (нужно сделать)

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Да не. Тут вопрос про FFI и автопреобразование.

Пусть есть библиотека:

#![crate_type = "dylib"]

#[no_mangle]
pub extern fn treble(value: str) -> int32 {
    value.len()
}

И вызываем её из растовской программы через FFI. FFI не знает про str, поэтому при вызове будет один раз копирование на стороне вызывающей программы (str -> char*) и ещё раз на стороне библиотеки (char* -> str).

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.