Re: Memory-mapped sub-data?
Re: Memory-mapped sub-data?
- Subject: Re: Memory-mapped sub-data?
- From: Jens Alfke <email@hidden>
- Date: Mon, 27 Feb 2017 08:56:42 -0800
> On Feb 26, 2017, at 2:34 PM, Daryle Walker <email@hidden> wrote:
>
> If I take a "subdata" of a memory-mapped (NS)Data, does it stay mapped (i.e. use a range and reference)? Or does a full copy get made? I'm thinking of making a parser be a sub-parser too, and this would make the difference between scanning the next megabyte or the rest-of-file (even if it's gigabytes).
Whew … that’s definitely an implementation detail, and the sort of thing that I’d imagine can change from one OS version to another. There are cases like yours where this behavior can be hugely valuable, and others where it can be a big performance problem (not so much with mapped data, but definitely with heap allocations.) Even if you did some experiments today and found that it works the way you want, there’s no guarantee it’ll keep working that way.
I recommend using a custom data structure instead of relying on NSData behavior. In my C++ code I’ve long relied on a simple struct I call “slice”: It’s just a {void*, size_t} representing an _unowned_ reference to a range of memory. It’s incredibly useful. You do have to be careful with memory management, since obviously something has to own the memory and you don’t want a slice to outlive the owner, but slices are very very lightweight and easy to pass around and subdivide.
You can easily create this on your own, but if you use C++ there are all kinds of bells and whistles you can add to it for convenience (including subclasses that do own memory the way NSData does.) The current version of my implementation lives here:
https://github.com/couchbaselabs/fleece/blob/master/Fleece/slice.hh
—Jens
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden