使用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;
};