What's the fastest way to check if a slice points to static data
via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Jun 24 10:57:34 PDT 2017
On Saturday, 24 June 2017 at 14:18:33 UTC, ketmar wrote:
>
> with the edge case when something like the code i posted below
> managed to make `a` perfectly aligned with r/o area, and you
> got segfault by accising out-of-bounds byte.
>
>> BTW, are you sure? AFAIU, it doesn't matter if the CTFE engine
>> returns a
>> non-null-terminated string expression, since the backend or
>> the glue layer
>> would write it to the object file as if it was a
>> null-terminated string.
>
> immutable ubyte[2] a = [65,66];
> enum string s = cast(string)a;
> immutable ubyte[2] b = [67,68]; // just to show you that there
> is no zero
>
> void main () {
> assert(s[$-1] == 0);
> }
Thanks, I haven't considered immutable statically allocated
fixed-size arrays of chars.
Specifically, while mutable fixed-size arrays of both character
and non-character type
are common, I don't think immutable fixed-size char arrays are
much used compared to string literals and ctfe-derived strings.
I'm tempted to write in the documentation of my hypothetical
fastStringZ function that passing anything, but something
originating from a slice is UB, though I'm aware how
under-specified and hand-wavy this sounds.
On Saturday, 24 June 2017 at 14:21:23 UTC, ketmar wrote:
> ketmar wrote:
>
>> p.s.: btw, druntime tries to avoid that edge case by not
>> checking for trailing out-of-bounds zero if string ends
>> exactly on dword boundary. it will miss some strings this way,
>> but otherwise it is perfectly safe.
>
> oops. not druntime, phobos, in `std.string.toStringz()`.
Thanks, for some reason I assumed that toStringz always
conservatively copies the string, without even checking the code.
It looks like the more aggressive optimization was at some point
removed which is visible in this revision:
http://www.dsource.org/projects/phobos/changeset/101#file15
and later Andrei reintroduced it with the more conservative
heuristic:
https://github.com/dlang/phobos/commit/460c844b4fb9b96833871c111dd529d22129ab7c,
but I didn't manage to find any discussion about it.
***
But in any case, the null-terminated string was just an example
application.
I'm interested in a fast way to determine the "storage class" of
the memory
a slice or a pointer point to. I'm expecting some magic along the
lines of
checking the range of addresses that the rodata section resides
in memory.
Similar to how some allocators or the GC know if they own a range
of memory.
Any ideas on that?
***
More information about the Digitalmars-d-learn
mailing list