Size: a a a

Rust — русскоговорящее сообществo

2020 December 07

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Mikail Bagishov
Если это в одном месте происходит, то могу такое предложить: выдели память через std::alloc::alloc вручную, обработай nullptr и уже тогда делай Vec:from_raw
Это если ты знаешь сколько тебе памяти надо
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
А если там дерево объектов в хипе хрен там
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
Это если ты знаешь сколько тебе памяти надо
Ну мне кажется, что требуемое место для изображения можно посчитать
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
Это если ты знаешь сколько тебе памяти надо
Я знаю, это же ресайз картинок - там все размеры известны заранее.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
А если там дерево объектов в хипе хрен там
Не хотелось бы мне выделять дерево объектов в хипе и изящно обрабатывать OOM
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Я знаю, это же ресайз картинок - там все размеры известны заранее.
Ну тогда вариант вот этот. Я бы предложил но не думал что тебе только этот сценарий нужен
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Mikail Bagishov
Не хотелось бы мне выделять дерево объектов в хипе и изящно обрабатывать OOM
а чо нет-то? В терминах сишарпа

public static T? TryAlloc<T>(object[] args) {
  try { return Activator.CreateInstance<T>(args); }
  catch (OomException) { return null }
}
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
Ну тогда вариант вот этот. Я бы предложил но не думал что тебе только этот сценарий нужен
Да, согласен, наверное это преждевременно. Я просто увидел эту обработку в C-коде и решил в Rust тоже её сделать, но понял что это не так просто реализовать сейчас.
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Да, согласен, наверное это преждевременно. Я просто увидел эту обработку в C-коде и решил в Rust тоже её сделать, но понял что это не так просто реализовать сейчас.
да, я выше линканул пропозал. Пока что не сделали ничего для этого
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
в сишке где повсеместно if err != nil..., простите, Foo* result = ...; if (!result) { ... } с этим попроще
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
а чо нет-то? В терминах сишарпа

public static T? TryAlloc<T>(object[] args) {
  try { return Activator.CreateInstance<T>(args); }
  catch (OomException) { return null }
}
А код, который с этим деревом работает, готов к тому что там на любом месте может nullptr сидеть?
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
да, я выше линканул пропозал. Пока что не сделали ничего для этого
Ну, вроде как у вектора есть нестабильные методы try_reserve и try_reserve_exact, которые возвращают Result. Что-то видимо да сделали.
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Mikail Bagishov
А код, который с этим деревом работает, готов к тому что там на любом месте может nullptr сидеть?
готов, ты же видишь T?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Ну, вроде как у вектора есть нестабильные методы try_reserve и try_reserve_exact, которые возвращают Result. Что-то видимо да сделали.
я про решение вопроса в общем случае. Ну и это не поможет если у тебя вектор боксов и очередной бокс сделать не вышло)
источник

r

red75prime in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
Да, согласен, наверное это преждевременно. Я просто увидел эту обработку в C-коде и решил в Rust тоже её сделать, но понял что это не так просто реализовать сейчас.
Ну, не так уж чтобы очень сложно. По крайней мере для Box<[T]> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa3f3b2afe68ab94bb53efed88ab004e

Там правда утечка памяти на панике в T::default(). Так что всё-таки не просто.
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
red75prime
Ну, не так уж чтобы очень сложно. По крайней мере для Box<[T]> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa3f3b2afe68ab94bb53efed88ab004e

Там правда утечка памяти на панике в T::default(). Так что всё-таки не просто.
какая утечка для типа размером 0?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
или ты про цикл ниже?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообществo
а ты смотрел как трай_аллок в векторе сделан? Как они эту проблему решают?
источник

r

red75prime in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
или ты про цикл ниже?
Про цикл. vec![] панику без утечек обработает в любом случае
источник

r

red75prime in Rust — русскоговорящее сообществo
Αλεχ Zhukovsky
а ты смотрел как трай_аллок в векторе сделан? Как они эту проблему решают?
Решить не сложно. Перехватить панику, сделать drop_in_place для инициализированных элементов. Просто не стал писать
источник