std::optional的内存布局是怎样的?(c#与std::optional互操作)



使用c#互操作,我需要调用第三方c++库中的函数。c++函数需要一个std::optional参数:

void FunctionToCall(std::optional<wchar_t const*> arg)

我想我必须将std::optional建模为包含bool和指针的结构体。但是我没有找到任何关于std::optional内存布局的信息。内存布局甚至可能是特定于编译器的。所以,以防万一,它会产生不同:它看起来像c++库是用微软vc++编写的。

所以我的问题是:std::optional在vc++中的内存布局是什么?在这种情况下如何正确地进行互操作?

使用clang的pahole工具,结果如下


class optional<int> : _Optional_base<int, true, true> {
public:
};
struct _Optional_base<int, true, true> : _Optional_base_impl<int, std::_Optional_base<int, true, true> > {
struct _Optional_payload<int, true, true, true> _M_payload; /*     0     8 */
};
class _Optional_base_impl<int, std::_Optional_base<int, true, true> > {
protected:
};
struct _Optional_payload<int, true, true, true> : _Optional_payload_base<int> {
};
struct _Optional_payload_base<int> {
union _Storage<int, true>  _M_payload;           /*     0     4 */
bool                       _M_engaged;           /*     4     1 */
};
union _Storage<int, true> {
struct _Empty_byte         _M_empty;           /*     0     0 */
int                        _M_value;           /*     0     4 */
};
struct _Empty_byte {
};

Godbolt: https://godbolt.org/z/r4KTfYKoW

最后相当于

class optional<int> { 
int value;
bool used;
};

相关内容

  • 没有找到相关文章

最新更新