6 ms·
Another option is a struct with a FAM at the end. typedef struct { size_t len; uint8_t data[]; } ByteBuf; Then, allocation becomes ByteBuf
by kkdwivedi 6y ago
Another option is a struct with a FAM at the end.
typedef struct {
size_t len;
uint8_t data[];
} ByteBuf;
Then, allocation becomes
ByteBuf *b = malloc(sizeof(*b) + sizeof(uint8_t) * array_size);
b->len = array_size;
and data is no longer a pointer.
- ATsch 6y agoWell, your ByteBuf is still a pointer. You also now need to dereference it to get the length. It also can't be passed by value, since it's very big. You can also not have multiple ByteBufs pointing at subsections of the same region of memory. Thing is, you rarely want to share just a buffer anyway. You probably have additional state, locks, etc. So what I do is embed my ByteBuf directly into another structure, which then owns it completely: typedef struct { ... ByteBuf mybuffer; ... } SomeThing; So we end up with the same amount of pointers (1), but with some unique advantages.
- kevin_thibedeau 6y agoThis will an alignment problem on any platform with data types larger than size_t. You'd need an alignas(max_align_t) on the struct. At which point some people are going to be unhappy about the wasteful padding on a memory constrained target.