c++ std::optional的内存布局是什么?(C#与std::optional的互操作)

vjhs03f7  于 2023-04-13  发布在  C#
关注(0)|答案(1)|浏览(159)

使用C# interop,我需要调用第三方C库中的函数。C函数需要一个std::optional参数:

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

我想我必须将std::optional建模为包含bool和指针的结构体。但是我没有找到任何关于std::optional的内存布局的信息。内存布局甚至可能是特定于编译器的。所以,以防万一它会有所不同:C库看起来像是用Microsoft VC编写的。
所以我的问题是VC++中std::optional的内存布局是什么?如何正确进行互操作?

y53ybaqx

y53ybaqx1#

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

相关问题