5 ms·
IMHO, Rust just should take size of the largest implementation of Animal for `impl Animal`, and viola — we can make them static. No heap is good for embedded.
by v_lisivka 8y ago
IMHO, Rust just should take size of the largest implementation of Animal for `impl Animal`, and viola — we can make them static. No heap is good for embedded.
- Gladdyu 8y agoWould this not require all impls to be in the same translation unit or the linker has to be explicitly aware of it?
- v_lisivka 8y agoIn case of embedded firmware, all impls will be in same unit. In case of a program with linked libraries, only main program will know sizes of all possible impls.
- MHordecki 8y agoNote that it's quite possible for a trait to have infinitely many implementations in any given program. For example, Debug is implemented by u64, Box<u64>, Box<Box<u64>>, ..., and so on. While these happen to have the same size, it's not hard to imagine a situation where this is not the case.
- majewsky 8y agoYour situation is already sufficiently impossible because it shows that for a given trait, the set of implementors is often (countably) infinite.
- comex 8y agoHowever, the number of implementors actually instantiated in any given program is necessarily finite. You could write a program that would make it infinite, e.g. trait Foo { fn foo(); } impl<T> Foo for T { fn foo() { <Box<T> as Foo>::foo(); } } ...but the compiler can't compile it: since Rust implements generics solely through monomorphization, that would require generating an infinitely large binary :)
- oconnor663 8y ago> Rust implements generics solely through monomorphization That doesn't sound right. Trait objects use dynamic dispatch.
- giornogiovanna 8y agoYou can obviously use an `enum` for this, and it's not so clunky that I think Rust should add yet another feature for it.