|
|
Message-ID: <3079272.0QQBjFxQff@tjmaciei-mobl5>
Date: Fri, 31 Oct 2025 10:25:27 -0700
From: Thiago Macieira <thiago@...ieira.org>
To: Alejandro Colomar <alx@...nel.org>, Paul Eggert <eggert@...ucla.edu>
Cc: libc-alpha@...rceware.org, musl@...ts.openwall.com,
"A. Wilcox" <AWilcox@...cox-tech.com>,
Lénárd Szolnoki <cpp@...ardszolnoki.com>,
Collin Funk <collin.funk1@...il.com>,
Arthur O'Dwyer <arthur.j.odwyer@...il.com>,
Jonathan Wakely <jwakely@...hat.com>, "Paul E. McKenney" <paulmck@...nel.org>
Subject: Re: Re: realloci(): A realloc() variant that works in-place
On Friday, 31 October 2025 09:59:43 Pacific Daylight Time Paul Eggert wrote:
> Reading the threads leading into this, the motivation for this seems to
> be C++ and similar memory allocators that want a cheap way to grow an
> object - if the object doesn't move they can skip some reinitialization
> work, otherwise they have more work to do.
>
> With that in mind, the proposed API is not the best way to go about the
> problem. What these users want is a function that acts just like
> R=realloc(P,N) EXCEPT that it lets you compare R==P, and if the two
> values are the same pointer you know the object did not move and you can
> skip some work. This is simpler than realloci because it means that you
> need only one call (not two) in the common case when realloci returns
> the null pointer.
If you meant a "resize-in-place or malloc new" function, I might agree. That
would reduce the number of function calls in the example I posted in the other
email, eliminating the malloc() call. Though it remains to be seen if that's
actually better, because there are cases where the malloc()+move+free() is
still needed, so the code could be shared across multiple uses and thus reduce
codegen size. Then there's the case of shrinking, where knowing that the
operation is guaranteed to be O(1) is beneficial.
But not this:
> In other words, these uses want the realloc function the way it was in
> 7th Edition Unix
>From the C++ side, we *cannot* allow the object to be relocated in memory
without its permission. We need to know the function *will not* move the
memory region before calling it, because there's currently no way to
generically adjust the relocated objects after the fact. That is why realloc()
is currently little used in C++.
That would require a new extension point for almost every class, which means
it becomes an opt-in and only available for code written to support C++29 at
the earliest.
That's assuming it's even possible. How would one adjust sub-objects of an
object? One thing that keeps coming up are the ARM64e authenticated
pointers[1], and from my limited understanding of the feature, it might not be
possible to write the new authenticated pointer to the new location without
reading from the old. I think the Committee would balk at adding a function
that takes a pointer to already-freed memory whose purpose is to allow the
contents of the new object to be adjusted solely based on arithmetic.
[1] https://clang.llvm.org/docs/PointerAuthentication.html
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Principal Engineer - Intel Data Center - Platform & Sys. Eng.
Download attachment "signature.asc" of type "application/pgp-signature" (871 bytes)
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.