Skip to content

Moka get_with inflates future size by ~7x #212

@Swatinem

Description

@Swatinem

Consider the following example:

fn main() {
    let cache = moka::future::Cache::new(1);
    let get_fut = async {
        let buf = [0u8; 1024];
        async {}.await;
        drop(buf);
    };
    println!("get_fut size: {}", std::mem::size_of_val(&get_fut));
    let moka_fut = cache.get_with((), get_fut);
    println!("moka_fut size: {}", std::mem::size_of_val(&moka_fut));
}

This outputs the following (even in --release mode):

get_fut size: 1026
moka_fut size: 7688

The resulting future grows by pretty much 7x the size of the future I provide.

The problem does not seem to be affected by rust-lang/rust#62321 though.
If I comment out the two println statements, I can use a nightly compiler to log the type sizes, using cargo +nightly rustc -- -Zprint-type-sizes:

-Zprint-type-sizes
print-type-size type: `[async fn body@moka::future::Cache<(), ()>::get_with<[async block@src\main.rs:3:19: 7:6]>::{closure#0}]`: 7688 bytes, alignment: 8 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend0`: 7684 bytes
print-type-size         field `.key`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size         field `.key`: 0 bytes
print-type-size         field `.__awaitee`: 6648 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `..generator_field2`: 1 bytes
print-type-size         field `..generator_field3`: 1 bytes
print-type-size     variant `Unresumed`: 7682 bytes
print-type-size         field `.key`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size         padding: 6648 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Returned`: 7682 bytes
print-type-size         field `.key`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size         padding: 6648 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Panicked`: 7682 bytes
print-type-size         field `.key`: 0 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size         padding: 6648 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     end padding: 3 bytes
print-type-size type: `[async fn body@moka::future::Cache<(), ()>::get_or_insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]`: 6648 bytes, alignment: 8 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend0`: 6647 bytes
print-type-size         field `.__awaitee`: 5568 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.hash`: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `.maybe_v`: 1 bytes
print-type-size         field `..generator_field4`: 1 bytes
print-type-size         field `..generator_field5`: 1 bytes
print-type-size         field `..generator_field6`: 1 bytes
print-type-size         field `..generator_field7`: 1 bytes
print-type-size     variant `Unresumed`: 6642 bytes
print-type-size         padding: 5567 bytes
print-type-size         field `.hash`: 8 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Returned`: 6642 bytes
print-type-size         padding: 5567 bytes
print-type-size         field `.hash`: 8 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Panicked`: 6642 bytes
print-type-size         padding: 5567 bytes
print-type-size         field `.hash`: 8 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size type: `std::mem::ManuallyDrop<[async fn body@moka::future::Cache<(), ()>::get_or_insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]>`: 6648 bytes, alignment: 8 bytes
print-type-size     field `.value`: 6648 bytes
print-type-size type: `std::mem::MaybeUninit<[async fn body@moka::future::Cache<(), ()>::get_or_insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]>`: 6648 bytes, alignment: 8 bytes
print-type-size     variant `MaybeUninit`: 6648 bytes
print-type-size         field `.uninit`: 0 bytes
print-type-size         field `.value`: 6648 bytes
print-type-size type: `[async fn body@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]`: 5568 bytes, alignment: 8 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend0`: 5563 bytes
print-type-size         field `.hash`: 8 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.hash`: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         field `.__awaitee`: 4472 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `..generator_field5`: 1 bytes
print-type-size     variant `Unresumed`: 5562 bytes
print-type-size         field `.hash`: 8 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 4504 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Returned`: 5562 bytes
print-type-size         field `.hash`: 8 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 4504 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Panicked`: 5562 bytes
print-type-size         field `.hash`: 8 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.replace_if`: 8 bytes
print-type-size         padding: 4504 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     end padding: 4 bytes
print-type-size type: `std::mem::ManuallyDrop<[async fn body@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]>`: 5568 bytes, alignment: 8 bytes
print-type-size     field `.value`: 5568 bytes
print-type-size type: `std::mem::MaybeUninit<[async fn body@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}]>`: 5568 bytes, alignment: 8 bytes
print-type-size     variant `MaybeUninit`: 5568 bytes
print-type-size         field `.uninit`: 0 bytes
print-type-size         field `.value`: 5568 bytes
print-type-size type: `[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}]`: 4472 bytes, alignment: 8 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend0`: 4468 bytes
print-type-size         field `.__awaitee`: 3360 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.get`: 32 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.insert`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `..generator_field2`: 1 bytes
print-type-size         field `..generator_field3`: 1 bytes
print-type-size     variant `Unresumed`: 4466 bytes
print-type-size         padding: 3359 bytes
print-type-size         field `.get`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.insert`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Returned`: 4466 bytes
print-type-size         padding: 3359 bytes
print-type-size         field `.get`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.insert`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     variant `Panicked`: 4466 bytes
print-type-size         padding: 3359 bytes
print-type-size         field `.get`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.insert`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size     end padding: 3 bytes
print-type-size type: `std::mem::ManuallyDrop<[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}]>`: 4472 bytes, alignment: 8 bytes
print-type-size     field `.value`: 4472 bytes
print-type-size type: `std::mem::MaybeUninit<[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}]>`: 4472 bytes, alignment: 8 bytes
print-type-size     variant `MaybeUninit`: 4472 bytes
print-type-size         field `.uninit`: 0 bytes
print-type-size         field `.value`: 4472 bytes
print-type-size type: `[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::do_try_init<'_, (), (), [closure@moka::future::value_initializer::make_pre_init<(), (), [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}]>::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}::{closure#0}]>::{closure#0}]`: 3360 bytes, alignment: 8 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend1`: 3353 bytes
print-type-size         field `.pre_init`: 32 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.pre_init`: 32 bytes
print-type-size         field `.cht_key`: 16 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.hash`: 8 bytes, alignment: 8 bytes
print-type-size         field `.waiter`: 8 bytes
print-type-size         field `..generator_field9`: 8 bytes
print-type-size         field `.waiter_guard`: 56 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 1026 bytes
print-type-size         field `.init`: 1026 bytes, alignment: 1 bytes
print-type-size         field `..generator_field16`: 1 bytes
print-type-size         field `..generator_field17`: 1 bytes
print-type-size         field `..generator_field18`: 1 bytes
print-type-size         field `..generator_field19`: 1 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.__awaitee`: 1026 bytes, alignment: 1 bytes
print-type-size     variant `Suspend0`: 2439 bytes
print-type-size         field `.pre_init`: 32 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.pre_init`: 32 bytes
print-type-size         field `.cht_key`: 16 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         field `.retries`: 8 bytes
print-type-size         field `.hash`: 8 bytes
print-type-size         field `.waiter`: 8 bytes
print-type-size         padding: 64 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `..generator_field16`: 1 bytes
print-type-size         field `..generator_field17`: 1 bytes
print-type-size         field `..generator_field18`: 1 bytes
print-type-size         padding: 9 bytes
print-type-size         field `.__awaitee`: 112 bytes, alignment: 8 bytes
print-type-size     variant `Suspend3`: 2375 bytes
print-type-size         field `.pre_init`: 32 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.pre_init`: 32 bytes
print-type-size         field `.cht_key`: 16 bytes
print-type-size         padding: 16 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         field `.retries`: 8 bytes
print-type-size         field `.hash`: 8 bytes
print-type-size         field `.waiter`: 8 bytes
print-type-size         field `..generator_field9`: 8 bytes
print-type-size         padding: 56 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `.init`: 1026 bytes
print-type-size         field `..generator_field16`: 1 bytes
print-type-size         field `..generator_field17`: 1 bytes
print-type-size         field `..generator_field18`: 1 bytes
print-type-size         field `..generator_field19`: 1 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.res`: 8 bytes, alignment: 8 bytes
print-type-size         field `.__awaitee`: 40 bytes
print-type-size     variant `Suspend2`: 2343 bytes
print-type-size         field `.pre_init`: 32 bytes, offset: 0 bytes, alignment: 8 bytes
print-type-size         field `.pre_init`: 32 bytes
print-type-size         field `.cht_key`: 16 bytes
print-type-size         field `..generator_field11`: 16 bytes
print-type-size         field `.type_id`: 8 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         padding: 32 bytes
print-type-size         field `.hash`: 8 bytes, alignment: 8 bytes
print-type-size         field `.waiter`: 8 bytes
print-type-size         field `..generator_field9`: 8 bytes
print-type-size         field `.waiter_guard`: 56 bytes
print-type-size         field `.self`: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 1026 bytes
print-type-size         field `.init`: 1026 bytes, alignment: 1 bytes
print-type-size         field `..generator_field16`: 1 bytes
print-type-size         field `..generator_field17`: 1 bytes
print-type-size         field `..generator_field18`: 1 bytes
print-type-size         field `..generator_field19`: 1 bytes
print-type-size         padding: 8 bytes
print-type-size         field `.__awaitee`: 16 bytes, alignment: 8 bytes
print-type-size     variant `Unresumed`: 2316 bytes
print-type-size         padding: 31 bytes
print-type-size         field `.pre_init`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 32 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         padding: 120 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 1026 bytes
print-type-size         field `.init`: 1026 bytes, alignment: 1 bytes
print-type-size     variant `Returned`: 2316 bytes
print-type-size         padding: 31 bytes
print-type-size         field `.pre_init`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 32 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         padding: 120 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 1026 bytes
print-type-size         field `.init`: 1026 bytes, alignment: 1 bytes
print-type-size     variant `Panicked`: 2316 bytes
print-type-size         padding: 31 bytes
print-type-size         field `.pre_init`: 32 bytes, alignment: 8 bytes
print-type-size         padding: 32 bytes
print-type-size         field `.type_id`: 8 bytes, alignment: 8 bytes
print-type-size         padding: 120 bytes
print-type-size         field `.self`: 8 bytes, alignment: 8 bytes
print-type-size         field `.key`: 8 bytes
print-type-size         field `.post_init`: 24 bytes
print-type-size         padding: 1026 bytes
print-type-size         field `.init`: 1026 bytes, alignment: 1 bytes
print-type-size     end padding: 6 bytes
print-type-size type: `std::mem::ManuallyDrop<[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::do_try_init<'_, (), (), [closure@moka::future::value_initializer::make_pre_init<(), (), [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}]>::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}::{closure#0}]>::{closure#0}]>`: 3360 bytes, alignment: 8 bytes
print-type-size     field `.value`: 3360 bytes
print-type-size type: `std::mem::MaybeUninit<[async fn body@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::do_try_init<'_, (), (), [closure@moka::future::value_initializer::make_pre_init<(), (), [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}]>::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::value_initializer::ValueInitializer<(), (), std::collections::hash_map::RandomState>::init_or_read<'_, [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#0}], [async block@src\main.rs:3:19: 7:6], [closure@moka::future::Cache<(), ()>::insert_with_hash_and_fun<[async block@src\main.rs:3:19: 7:6], for<'a> fn(&'a ()) -> bool>::{closure#0}::{closure#1}]>::{closure#0}::{closure#0}]>::{closure#0}]>`: 3360 bytes, alignment: 8 bytes
print-type-size     variant `MaybeUninit`: 3360 bytes
print-type-size         field `.uninit`: 0 bytes
print-type-size         field `.value`: 3360 bytes
print-type-size type: `crossbeam_epoch::internal::Local`: 2104 bytes, alignment: 8 bytes
print-type-size     field `.entry`: 8 bytes
print-type-size     field `.epoch`: 8 bytes
print-type-size     field `.collector`: 8 bytes
print-type-size     field `.bag`: 2056 bytes
print-type-size     field `.guard_count`: 8 bytes
print-type-size     field `.handle_count`: 8 bytes
print-type-size     field `.pin_count`: 8 bytes
print-type-size type: `crossbeam_epoch::sync::queue::Node<crossbeam_epoch::internal::SealedBag>`: 2072 bytes, alignment: 8 bytes
print-type-size     field `.data`: 2064 bytes
print-type-size     field `.next`: 8 bytes
print-type-size type: `crossbeam_epoch::internal::SealedBag`: 2064 bytes, alignment: 8 bytes
print-type-size     field `.epoch`: 8 bytes
print-type-size     field `._bag`: 2056 bytes
print-type-size type: `std::mem::ManuallyDrop<crossbeam_epoch::internal::SealedBag>`: 2064 bytes, alignment: 8 bytes
print-type-size     field `.value`: 2064 bytes
print-type-size type: `std::mem::MaybeUninit<crossbeam_epoch::internal::SealedBag>`: 2064 bytes, alignment: 8 bytes
print-type-size     variant `MaybeUninit`: 2064 bytes
print-type-size         field `.uninit`: 0 bytes
print-type-size         field `.value`: 2064 bytes
print-type-size type: `crossbeam_epoch::internal::Bag`: 2056 bytes, alignment: 8 bytes
print-type-size     field `.deferreds`: 2048 bytes
print-type-size     field `.len`: 8 bytes
print-type-size type: `crossbeam_epoch::primitive::cell::UnsafeCell<crossbeam_epoch::internal::Bag>`: 2056 bytes, alignment: 8 bytes
print-type-size     field `.0`: 2056 bytes
print-type-size type: `std::cell::UnsafeCell<crossbeam_epoch::internal::Bag>`: 2056 bytes, alignment: 8 bytes
print-type-size     field `.value`: 2056 bytes
print-type-size type: `crossbeam_channel::flavors::list::Block<moka::common::concurrent::WriteOp<(), ()>>`: 1248 bytes, alignment: 8 bytes
print-type-size     field `.next`: 8 bytes
print-type-size     field `.slots`: 1240 bytes
print-type-size type: `crossbeam_channel::flavors::list::Block<moka::notification::notifier::RemovedEntries<(), ()>>`: 1248 bytes, alignment: 8 bytes
print-type-size     field `.next`: 8 bytes
print-type-size     field `.slots`: 1240 bytes
print-type-size type: `[async block@src\main.rs:3:19: 7:6]`: 1026 bytes, alignment: 1 bytes
print-type-size     discriminant: 1 bytes
print-type-size     variant `Suspend0`: 1025 bytes
print-type-size         field `.buf`: 1024 bytes, offset: 0 bytes, alignment: 1 bytes
print-type-size         field `.__awaitee`: 1 bytes
print-type-size     variant `Unresumed`: 0 bytes
print-type-size     variant `Returned`: 0 bytes
print-type-size     variant `Panicked`: 0 bytes

This problem manifests itself here: getsentry/symbolicator#979
The tests are failing due to stack overflows.

I believe there is a workaround though to intentionally use Box::pin to reduce the size of the future passed to get_with.

Also, get_with has roughly an overhead of ~616 bytes, if I give it an empty future (though I believe that still has at least a discriminant).

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions