-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Assist/Codelens to show size of type #4091
Comments
This is going to be very hard to implement, as this basically requires a reimplementation of the layout code in rustc: https://github.com/rust-lang/rust/blob/8ce3f840ae9b735a66531996c32330f24b877cb0/src/librustc_middle/ty/layout.rs is 2776 lines long. It also depends on the exact version of rustc you are using, so it would have to be changed constantly. |
It also depends on the compilation target... |
Maybe when the librarification progresses, rust-analyzer and rustc could use the same code? |
Yeah, I feel like this is obviously something we should have. More deneraly, we should have an intention to see the whole layout. But it's also true that even MVP version of this would required a lot of progress on modularisation front |
I do miss this a lot. Especially since clangd can show you the size of a struct and the size and offset of its fields. |
#12972 is an interesting feature request: it asks for the type of each variant in an enum. |
If we only need the size, maintaining |
I don't think it would be much easier. Maybe a bit. |
This would be particularly useful for the implicit futures created by async functions, as per rust-lang/rust-clippy#5263. |
Compute data layout of types cc #4091 Things that aren't working: * Closures * Generators (so no support for `Future` I think) * Opaque types * Type alias and associated types which may need normalization Things that show wrong result: * ~Enums with explicit discriminant~ * SIMD types * ~`NonZero*` and similar standard library items which control layout with special attributes~ At the user level, I didn't put much work, since I wasn't confident about what is the best way to present this information. Currently it shows size and align for ADTs, and size, align, offset for struct fields, in the hover, similar to clangd. I used it some days and I feel I liked it, but we may consider it too noisy and move it to an assist or command.
Initial support added in #13490. |
I find the comments inside the hovers a bit distracting, maybe they should be opt-in? It's information I need very rarely. |
We should make it configurable, but opt-out as usual. |
Should this not be considered undefined for non-repr structs? I look at it as though this is leaking information that cannot/should not be depended on. If this information is shown, it should only be shown in contexts where the layout is actually defined. This may be a pedantic or poor take, but I do have concerns about the idea of this information being used in a way that ignores the potential UB otherwise. It's happened before. Any instance in which you care about sizing/align should specify a layout anyways. |
Someone messing with a |
Yes, depending on the size/alignment is undefined behavior unless they are For example, I uses this information to optimize my code to extract information from I do not hard code the size/alignment information given by rustc/rust-analyzer in my code anyway and just use that to guide optimizations.
That's exactly my use case, but clippy won't help a lot since Also, I'd like to know the size of the future returned by For example Having to run that every time to find out which types grow out of control is inefficient and I'd really like it to be shown in rust-analyzer by default, for variables and |
RA won't help either, for the same reason :(. |
Well, can it print out size of the future generated by async fn/block? |
No, as r-a doesn't support generator and closure captures yet |
I would really love to see that. |
Nightly rustdoc has |
Thanks, that will very helpful and I hope it gets turned on by default so that the size info will be accessible on docs.rs instead of requiring building doc on local. Though I guess it won't show |
Maybe. I'm not convinced someone throwing themselves in from a C background would say it's obvious non-repr structs don't have a defined memory layout. Missized allocations and naive assumptions about layout aren't exactly uncommon in the C (or cpp) world. |
Exactly. And that's without the IDE showing them the type layout, so having this information available won't matter if you really insist on doing it. But Rust developers need to use |
Maybe we can add a |
Rust is a language that tends to push you in safe directions, and the point that I had originally made was that very smart people made a very poor choice to rely on UB in memory layouts without anything suggesting that it was ok to do. Api limitations or not adding alignment and size information to something which is undefined makes things like my original post was referencing easier to stumble through or think is ok. Not every person using rust, even unsafe rust, knows or understands everything. Tools should point you in the right direction. Not just provide foot guns for people who don't know better. Adding some annotation to indicate that the layout is unstable is a good suggestion, and would resolve my objections to putting it on non-repr structs. |
Is this a well defined concept? In my understanding, layout of a variant has the same size as the layout of its enum, it just has more paddings. |
Cargo has a lint that triggers when the biggest variant is a lot bigger than the second biggest. So the request there is really (I think), what is the variant's size disregarding it being an enum (so no tag, no padding from other variants, effectively handling it as a struct). |
Layout of enum variant is implemented in #14845. I'm going to close this issue, feel free to open more specific ones if needed. |
Example:
()<|>
-> shows 0char<|>
-> shows 4struct Foo<|> { ... }
shows whateverstd::mem::size_of::<Foo>()
returnsThe text was updated successfully, but these errors were encountered: