I am designing a C++ DLL with extern "C" bindings for use in Python and C#. Some of the structures passed around currently contain C strings that I'm considering to change to std::string_view
for following benefits:
strlen
Is std::string_view
(and std::span<T>
which is pretty much the same thing) guaranteed to be exactly { T*; size_t; }
, or am I safer to create my own struct for it to maintain ABI across languages? cppreference lists "data members" which suggests the layout is guaranteed by the standard.
Is
std::string_view
(andstd::span<T>
which is pretty much the same thing) guaranteed to be exactly{ T*; size_t; }
No, you have no such guarantees. gcc
for example declares the std::basic_string_view
members in this order:
size_t _M_len;
const _CharT* _M_str;
or am I safer to create my own struct for it to maintain ABI across languages?
Yes, that would be the safest.