H1 2015 - memory management
Jonathan Marler via Digitalmars-d
digitalmars-d at puremagic.com
Wed Feb 4 14:53:59 PST 2015
On Wednesday, 4 February 2015 at 21:51:55 UTC, AndyC wrote:
> The vision says "We aim to make the standard library usable in
> its entirety without a garbage collector. Safe code should not
> require the presence of a garbage collector"
>
> I was just playing with std.json, and this part got me to
> thinking. How will we parse a string into a json struct w/out
> allocating memory?
>
> And if I allocate memory w/out the GC, then is the caller
> responsible to free it?
>
> Things like string format and file read are gonna have to alloc
> memory, yes? How will we make std.* usable w/out the GC?
>
> -Andy
It depends on the implementation, but it should be possible to
parse an entire JSON file without allocating memory. Instead of
creating new memory for every string in the JSON, you can just
save a slice to the JSON itself. However, this will not work if
the user intends on freeing the JSON memory later. Either way,
this is an option I believe the library should provide. In some
cases it's more efficient to read the entire JSON file into
memory and just save slices into that memory.
Note: If you need to escape strings you will have to modify the
original JSON in memory, which may or may not be ok. Again, the
library should provide a way to specify this.
You could also allow the user to pass an allocator to the JSON
library. This allows memory management to be implemented by the
user instead of forcing everyone to use whatever memory
management the JSON library uses.
One last tip. If you don't care about preserving the original
JSON, you can re-use the JSON memory by "moving" all the strings
you need for your in-memory JSON at the begining of the JSON
buffer.
Original JSON memory:
{
"myid" : "hello"
}
"in-memory" JSON
myidhello
^ ^
All the strings are moved to the beginning of the JSON buffer.
Then you can decide if it's worth it to free the original JSON
buffer and copy what you need to a new buffer or just keep the
original buffer and ignore the wasted space left over.
More information about the Digitalmars-d
mailing list