Size: a a a

2020 December 23

b

in Rust Beginners
нет, не совсем понял принцип
источник

E

Eugene in Rust Beginners
нет, не совсем понял принцип
библиотеке надо сохранить данные?
источник

b

in Rust Beginners
сейчас объясню
источник

b

in Rust Beginners
есть приложение A, оно большое, к нему я подключил свою либу на расте, эта либа читает из переменной окружения base64 (предварительно загруженный туда), декодирует, deserialize'ует с помощью serde_json, и уже отдаёт ответ.
хедер этой либы выглядит как -то так
char* get_char_for(char*)
bool get_bool_for(char*)
int get_int_for(char*)

так вот, каждый вызов одной из функции - это чтение из переменной окружения, декодирование, и ответ. функции вызываются часто, визуально я не вижу проблем с производительностью, да и вызываются они коонечно не настолько часто (типа 10к вызовов в секунду, такого нет).
но всё это постоянное расшифровывание и чтение мне не нравится. хочется один раз загрузить (данные в переменной статичны) и уже работать с ними
источник

MB

Mikail Bagishov in Rust Beginners
once_cell выглядит как самое лучшее решение
источник

MB

Mikail Bagishov in Rust Beginners
Ну или любое другое хранение результата в глобальной переменной, но once_cell пожалуй самый  удобный
источник

b

in Rust Beginners
в глобальной переменной либы, или же глобальной переменной уже самого приложения A?
источник

MB

Mikail Bagishov in Rust Beginners
либа создает глобальную переменную
источник

MB

Mikail Bagishov in Rust Beginners
Ну, я выше примерный код кидал
источник

MB

Mikail Bagishov in Rust Beginners
Mikail Bagishov
#[no_mangle]
pub extern "C" fn is_aiza() -> bool {
   static VAL: once_cell::sync::Lazy = once_cell::sync::Lazy::new(is_aiza_internal);
   *VAL
}
.
источник

b

in Rust Beginners
вообщем попробовал создать static mut test: i32 = 0;
и инкрементировать при каждом вызове через unsafe блок, насколько это опасно если я вместо i32 сделаю Box<Engine> (то, что обрабатывает все запросы) и буду тупо инициализировать, если она не иницилизрована?
источник

MB

Mikail Bagishov in Rust Beginners
вообщем попробовал создать static mut test: i32 = 0;
и инкрементировать при каждом вызове через unsafe блок, насколько это опасно если я вместо i32 сделаю Box<Engine> (то, что обрабатывает все запросы) и буду тупо инициализировать, если она не иницилизрована?
Лучше once_cell используй.
источник

b

in Rust Beginners
сейчас попробую тогда
источник

MB

Mikail Bagishov in Rust Beginners
Если ты 100% уверен, что либа будет использовать однопоточно, то конечно сваять велосипед на статик переменных будет нетрудно. Но все равно более многословно, чем готовые либы. И если все-таки окажется, что приложение многопоточное, то будет очень больно.
источник

b

in Rust Beginners
оно многопоточное
источник

b

in Rust Beginners
это эксперимент с блоком unsafe
источник

MB

Mikail Bagishov in Rust Beginners
вообщем попробовал создать static mut test: i32 = 0;
и инкрементировать при каждом вызове через unsafe блок, насколько это опасно если я вместо i32 сделаю Box<Engine> (то, что обрабатывает все запросы) и буду тупо инициализировать, если она не иницилизрована?
Как ты проверяешь, что еще не инициализировано?
источник

b

in Rust Beginners
static eng: Engine = init_engine(); получается будет даже достаточно чтобы сократить количество инициализаци
источник

MB

Mikail Bagishov in Rust Beginners
Только если init_engine() может быть вычислена на этапе компиляции
источник

MB

Mikail Bagishov in Rust Beginners
Это отличие от C++, где ты можешь запихнуть в статик переменную класса с произвольным конструктором (не обязательно constexpr)
источник