einpoklum einpoklum - 2 months ago 24
C++ Question

Should I replace (void*, size) with a GSL span?

Suppose I have

int foo(void* p, size_t size_in_bytes);


and assume it doesn't make sense to make
foo
typed. I want to be a good coder and apply the C++ core guidelines. Specifically, I want to use spans instead of (*, len) pairs. Well,
span<void>
won't compile (can't add to a
void *
); and
span<char>
or
span<uint8_t>
etc. would imply foo actually expects chars, which it might not.

So should I use a
span<something-with-size-1>
in this case, or stick with
void*
?

Answer

What I chose to do, and what I think is, shall we say, sound design-wise, is implement a class named memory_region, which has all of the type-inspecific functionality of gsl::span (hence, for example, it doesn't have a begin() or an end()). It is not the same thing as a span of bytes, IMO - and I can structurally never get them mixed up.

Here's my implementation (it's part of a repository of DBMS-related GPU kernels and a testing framework I'm working on, hence the CUDA-related snippet; and it depends on some GSL, in my case gsl-lite by MS'es should be ok too I think).

Comments