История изменений
Исправление kvpfs_2, (текущая версия) :
Покажи, как ты собираешься ломать код на границе .so?
Где я сказал «ломать»? Я сказал, что статический анализатор не поможет и проверки надо делать в run time. Условно:
let mut my_arc = Arc::new(String::from("Hello"));
let a = &my_arc;
println!("{}", a); // Hello
// start: code in shared library
let val = Arc::get_mut(&mut my_arc);
if val.is_some() {
val.unwrap().push_str(" World");
} else {
println!("Cannot get_mut: There are multiple owners.");
}
// end: code in shared library
println!("{}", a);
Даже сейчас, если компилить всё в одной единице трансляции, то получается compile time error (т.к. есть живая ‘a’). А теперь представь, что код вынесен в либу, а в неё ты отдал ссылку на Arc, никакой возможности отработать у статического анализатора нет, будет оверхед в рантайме. Я ненастоящий растаман, но вопрос о том что будет после возврата из либы (как брать ссылки на Arc, ведь либа может припрятать ссылку и заюзать в любой момент), т.е. должно быть оказано влияние на вызывающий код (не в лучшую сторону, конечно же).
Допустим, что растоводы это предусмотрели, и не дают отправлять ссылки в «неизвестность», туда, где стат анализатор не может отработать (в либу, в нашем случае). Ок, тогде тебе нужно move’нуть объект в либу. Представь, что у нас в бинаре какая-то система с учетками клиентов, которых 100500, базы данных, прекрестные ссылки и всё такое. Мы хотим передать передать одну учетку клиента в какую-то либу, которая делает process_client(). Значит нам нужно вытащить учетку с данными о клиенте, убить во всех структурах данных, сделать сотню приседаний, вызвать process_client(), вернуться из него, всунуть учетку клиента обратно во все структуры данных нашего приложения. Чувствуешь, какой-здесь оверхед?
Допустим ты скажешь: «у нас есть rwlock, mutex, etc». Ok, но это опять оверхед в рантайме, всё это надо будет проверять и тратить время. А ц/ц++ может просто передать ссылку в process_client(), ничего не перемещать, без приседаний, без проверок, без обратных действий после возврата из process_client()
Исходная версия kvpfs_2, :
Покажи, как ты собираешься ломать код на границе .so?
Где я сказал «ломать»? Я сказал, что статический анализатор не поможет и проверки надо делать в run time. Условно:
let mut my_arc = Arc::new(String::from("Hello"));
let a = &my_arc;
println!("{}", a); // Hello
// start: code in shared library
let val = Arc::get_mut(&mut my_arc);
if val.is_some() {
val.unwrap().push_str(" World");
} else {
println!("Cannot get_mut: There are multiple owners.");
}
// end: code in shared library
println!("{}", a);
Даже сейчас, если компилить всё в одной единице трансляции, то получается compile time error (т.к. есть живая ‘a’). А теперь представь, что код вынесен в либу, а в неё ты отдал ссылку на Arc, никакой возможности отработать у статического анализатора нет, будет оверхед в рантайме. Я ненастоящий растаман, но вопрос о том что будет после возврата из либы (как брать ссылки на Arc, ведь либа может припрятать ссылку и заюзать в любой момент), т.е. должно быть оказано влияние на вызывающий код (не в лучшую сторону, конечно же).
Допустим, что растоводы это предусмотрели, и не дают отправлять ссылки в «неизвестность», туда, где стат анализатор не может отработать (в либу, в нашем случае). Ок, тогде тебе нужно move’нуть объект в либу. Представь, что у нас в бинаре какая-то система с учетками клиентов, которых 100500, базы данных, прекрестные ссылки и всё такое. Мы хотим передать передать одну учетку клиента в какую-то либу, которая делает process_client(). Значит нам нужно вытащить учетку с данными о клиенте, убить во всех структурах данных, сделать сотню приседаний, вызвать process_client(), вернуться из него, всунуть учетку клиента обратно во все структуры данных нашего приложения. Чувствуешь, какой-здесь оверхед?
Допустим ты скажешь: «у нас есть rwlock, mutex, etc». Ok, но это опять оверхед в рантайме, всё это надо будет проверять и тратить время.