Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
May 18, 2015 Convert C array pointer to a D slice without data copy | ||||
---|---|---|---|---|
| ||||
I get the point to an array from a c function, the data size from another function. The data should be only readable at the D side, but I would like to use it as a D slice without copying the data. Is this possible ? |
May 18, 2015 Re: Convert C array pointer to a D slice without data copy | ||||
---|---|---|---|---|
| ||||
Posted in reply to ParticlePeter | On Monday, 18 May 2015 at 09:18:33 UTC, ParticlePeter wrote:
> I get the point to an array from a c function, the data size from another function. The data should be only readable at the D side, but I would like to use it as a D slice without copying the data. Is this possible ?
char* dataPtr;
size_t dataLen;
auto data = dataPtr[0 .. dataLen];
This doesn't do any copying. BUT I am not sure what GC would be doing about it. After you use it, you might want to set `data` to null in case of a problem.
|
May 18, 2015 Re: Convert C array pointer to a D slice without data copy | ||||
---|---|---|---|---|
| ||||
Posted in reply to tcak | On Monday, 18 May 2015 at 09:23:26 UTC, tcak wrote:
> On Monday, 18 May 2015 at 09:18:33 UTC, ParticlePeter wrote:
>> I get the point to an array from a c function, the data size from another function. The data should be only readable at the D side, but I would like to use it as a D slice without copying the data. Is this possible ?
>
> char* dataPtr;
> size_t dataLen;
>
> auto data = dataPtr[0 .. dataLen];
>
> This doesn't do any copying. BUT I am not sure what GC would be doing about it. After you use it, you might want to set `data` to null in case of a problem.
Thanks, works. Should be in the "Interfacing to C" Reference Article.
|
May 18, 2015 Re: Convert C array pointer to a D slice without data copy | ||||
---|---|---|---|---|
| ||||
Posted in reply to tcak | On Monday, 18 May 2015 at 09:23:26 UTC, tcak wrote:
> On Monday, 18 May 2015 at 09:18:33 UTC, ParticlePeter wrote:
>> I get the point to an array from a c function, the data size from another function. The data should be only readable at the D side, but I would like to use it as a D slice without copying the data. Is this possible ?
>
> char* dataPtr;
> size_t dataLen;
>
> auto data = dataPtr[0 .. dataLen];
>
> This doesn't do any copying. BUT I am not sure what GC would be doing about it. After you use it, you might want to set `data` to null in case of a problem.
No need to worry about the GC here, it only scans the stack and its own heap (unless you specifically add a new root).
|
May 18, 2015 Re: Convert C array pointer to a D slice without data copy | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | Am Mon, 18 May 2015 09:51:48 +0000 schrieb "John Colvin" <john.loughran.colvin@gmail.com>: > No need to worry about the GC here, it only scans the stack and its own heap (unless you specifically add a new root). And even if you add a root it wont free anything it did not allocate itself! You could even append to your C array. It will check how much capacity the slice still has on the GC heap and after realizing the .ptr is not even in one of its pools, allocate a GC copy of the C array right away. -- Marco |
Copyright © 1999-2021 by the D Language Foundation