Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Wednesday August 05, 2020 @10:02AM
(#24060827)
Unless you are going to review the whole code, written from scratch, there is no way to actually be aware of all allocations in Rust without help from a memory profiler.
[ Parent
| on HN ]
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by dthul on Wednesday August 05, 2020 @10:36AM
(#24061235)
Just one or two days ago I asked here on HN how memory allocations in C++ are considered to be more hidden than in Rust and got some good replies: Especially constructors, copy constructors, assignment operators etc. can introduce non-obvious allocations.
For example:
T t;
a = b;
T t2 = t;
can all allocate in C++. The equivalent in Rust: let t: T; // won't allocate
let t = T::new(); // might allocate
a = b; // won't allocate
let t2 = t; // won't allocate
let t2 = t.clone(); // might allocate
So in Rust you can tell that as long as there is no function call, there won't be an allocation.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Wednesday August 05, 2020 @11:25AM
(#24061856)
Like operator overloading and implicit conversations.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by dthul on Wednesday August 05, 2020 @05:32PM
(#24065858)
True, those are even more places where C++ can implicitly allocate.
The operator overloading also applies to Rust. Rust has no implicit conversions though, which are arguably worse since they are invisible (that's why I usually mark all my expensive single argument constructors as "explicit").
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Thursday August 06, 2020 @02:06AM
(#24068507)
Sure it has, you cannot ensure Deref implementations don't allocate.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by dthul on Thursday August 06, 2020 @02:54AM
(#24068718)
While technically true, the documentation makes it very clear that Deref should only be implemented for smart pointers and never fail. So no allocations in practice.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Thursday August 06, 2020 @03:57AM
(#24068973)
Ah problem solved then, we just need to document very clear that C code should not corrupt memory, how did I never thought of it.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by cogman10 on Wednesday August 05, 2020 @10:32AM
(#24061194)
I think the point was more that allocations are fairly explicit.
There are a few places in C++ where allocation can happen pretty much invisibly. A copy constructor is an example of that. You might see a new allocation simply by calling a method.
With rust, you usually won't see an allocation unless it is explicitly called for. You can follow the call tree and very easily pick out when those allocations are happening.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Wednesday August 05, 2020 @11:26AM
(#24061865)
Rust also has operator overloading and implicit conversations, both can cause memory allocations.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by cogman10 on Wednesday August 05, 2020 @12:02PM
(#24062305)
Certainly. However, both of those things (from what I've seen) are fairly rare.
The C++ copy constructor comes up fairly frequently.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Wednesday August 05, 2020 @12:10PM
(#24062395)
Like unsafe Rust code, there is the theory and then there are the code bases that one finds out in the wild on crates.io and in-house, not necessarily using best practices.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by dthul on Wednesday August 05, 2020 @05:35PM
(#24065895)
Rust does not have implicit type conversions.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by pjmlp on Thursday August 06, 2020 @02:07AM
(#24068509)
Via Deref.
Re:Sub-10 ms Latency in Java: Concurrent GC with Green Threads
by dthul on Thursday August 06, 2020 @02:53AM
(#24068711)
Not in practice. It's only used for reference coercions to existing objects.
You would need to ignore the documentation and bend over backwards to use it for an actual type conversion, because you can only return references.