Void pointers
Alex via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue May 17 14:33:57 PDT 2016
On Tuesday, 17 May 2016 at 18:25:46 UTC, ag0aep6g wrote:
> On 05/17/2016 07:43 PM, Alex wrote:
>> The relation is: some object A contains the pointer/iota/(if
>> at all)
>> some object B makes slices of the thing, which is in A.
>
> Ok, so you have some object that stores a void pointer. The
> pointer is going to be null at all times. Then you slice that
> pointer. Is that right?
Yes.
>
> In code:
> ----
> class C
> {
> void* ptr = null; /* always going to stay null */
> void[] getSlice(size_t a, size_t b) { return ptr[a .. b]; }
> }
>
> void main()
> {
> auto c = new C;
> void[] slice1 = c.getSlice(5, 10);
> void[] slice2 = c.getSlice(7, 21);
> }
> ----
>
> Now you see a relation/dependency between slice1 and slice2,
> because the pointer they slice is the same, and it's stored in
> the same C object, right?
Yes.
>
> But when slicing a pointer what matters is the value of the
> pointer, not where it resides. Where the pointer is stored is
> completely irrelevant. Like when adding two ints it doesn't
> matter where they came from; only their values matter.
>
> Calling getSlice(5, 10) on two different C objects will return
> the exactly same slice (as long as ptr stays null):
Yes. This is the point where my error in reasoning resides...
>
> ----
> /* ... class C as above ... */
>
> void main()
> {
> auto c1 = new C;
> auto c2 = new C;
> assert(c1 !is c2); /* not the same object */
> assert(c1.getSlice(5, 10) is c2.getSlice(5, 10)); /* but
> the exact same slice */
> }
> ----
>
> There is no relationship between the slices or between a slice
> and the object that created it. You can have a free function
> that returns the exact same slices again:
>
> ----
> /* ... class C as above */
>
> void[] freeGetSlice(size_t a, size_t b)
> {
> void* ptr = null;
> return ptr[a .. b];
> }
>
> void main()
> {
> auto c = new C;
> assert(c.getSlice(5, 10) is freeGetSlice(5, 10));
> }
> ----
Yeah... now I see this...
>
> A note on iota: If you use iota instead, you don't need to
> store the result in the object either. You can call iota on the
> spot just like you call getSlice.
Thanks for disillusioning :)
More information about the Digitalmars-d-learn
mailing list