On Thursday, 18 August 2022 at 08:41:02 UTC, LinguisticMystic wrote:
I'm porting some C code for arena allocator to D, and somehow the flexible array members (a feature of C99 for dynamically-sized structs) work in D without significant changes in the code. Here's my arena definition:

```
struct ArenaChunk {
    size_t size;
    ArenaChunk* next;
    char[] memory; // flexible array member
}

struct Arena {
    ArenaChunk* firstChunk;
    ArenaChunk* currChunk;
    int currInd;
}
```

And here's how I use the FAM's memory for allocating stuff:

```
void* result = cast(void*)(&ar.currChunk.memory + ar.currInd);
```

I think the closest way to approximate this in D is to use a zero-length static array:

```d
struct ArenaChunk {
    size_t size;
    ArenaChunk* next;
    char[0] memory;
}
```

Then your usage example becomes

```
void* result = cast(void*)(ar.currChunk.memory.ptr + ar.currInd);
```

Note that in D you must use `.ptr` to get a pointer to the array's first element; it does not decay automatically like in C.

Reply via email to