Thread overview | ||||||
---|---|---|---|---|---|---|
|
September 27, 2017 Allocating byte aligned array | ||||
---|---|---|---|---|
| ||||
Hi guys, how can I allocate an (e.g. 16) byte aligned array? In C I can do the following: void *mem = malloc(1024+15); void *ptr = ((uintptr_t)mem+15) & ~ (uintptr_t)0x0F; memset_16aligned(ptr, 0, 1024); free(mem); I think in D it looks similar to this: auto mem = new ubyte[1024+15]; auto ptr = (mem.ptr + 15) & ~ (...???...) 0x0F; How to fill ...???... ? Without a cast, the compiler tells me that I the types are incompatible (ubyte* and int). What's the correct syntax here? PS: I don't want to use the experimental branch that provides alignedAllocate(). |
September 27, 2017 Re: Allocating byte aligned array | ||||
---|---|---|---|---|
| ||||
Posted in reply to timvol | On 09/27/2017 02:39 PM, timvol wrote: > Hi guys, > how can I allocate an (e.g. 16) byte aligned array? > In C I can do the following: > > void *mem = malloc(1024+15); > void *ptr = ((uintptr_t)mem+15) & ~ (uintptr_t)0x0F; > memset_16aligned(ptr, 0, 1024); > free(mem); > > I think in D it looks similar to this: > > auto mem = new ubyte[1024+15]; > auto ptr = (mem.ptr + 15) & ~ (...???...) 0x0F; > > How to fill ...???... ? > Without a cast, the compiler tells me that I the types are incompatible > (ubyte* and int). > > What's the correct syntax here? > > PS: I don't want to use the experimental branch that provides > alignedAllocate(). void main() { auto mem = new ubyte[1024+15]; auto ptr = cast(ubyte*)(cast(ulong)(mem.ptr + 15) & ~0x0FUL); auto arr = ptr[0..1024]; } Ali |
September 27, 2017 Re: Allocating byte aligned array | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Wednesday, 27 September 2017 at 21:44:48 UTC, Ali Çehreli wrote:
> On 09/27/2017 02:39 PM, timvol wrote:
>> [...]
>
> void main() {
> auto mem = new ubyte[1024+15];
> auto ptr = cast(ubyte*)(cast(ulong)(mem.ptr + 15) & ~0x0FUL);
> auto arr = ptr[0..1024];
> }
>
> Ali
Works perfect. Thank you!
|
September 29, 2017 Re: Allocating byte aligned array | ||||
---|---|---|---|---|
| ||||
Posted in reply to timvol | On Wednesday, 27 September 2017 at 21:48:35 UTC, timvol wrote:
> On Wednesday, 27 September 2017 at 21:44:48 UTC, Ali Çehreli wrote:
>> On 09/27/2017 02:39 PM, timvol wrote:
>>> [...]
>>
>> void main() {
>> auto mem = new ubyte[1024+15];
>> auto ptr = cast(ubyte*)(cast(ulong)(mem.ptr + 15) & ~0x0FUL);
>> auto arr = ptr[0..1024];
>> }
>>
>> Ali
>
> Works perfect. Thank you!
I know you can also use this with static arrays:
align(16) ubyte[1024] mem;
But I guess align directive doesn't work with dynamic arrays...
|
Copyright © 1999-2021 by the D Language Foundation