我正在尝试复制一个结构,以供另一个程序读取。

源程序:

        struct datas{
            std::string key;
        };

        datas mystructure = datas();
        std::string mychar = "mychar";// if length of char > 8, it doesn't get copied.

        mystructure.key = mychar;

        WriteToResources(param, 0, (BYTE*)&mystructure, sizeof(mystructure));

目标程序:
struct datas{
            std::string key;
        };

datas mystructure;
memcpy(&mystructure, pbindata, rsrcsize);

std::cout << (char*)mystructure.key.c_str();

当mychar的长度小于等于8时,它将被复制到资源中,并由目标程序很好地读取。
但是,如果mychar的长度> 8,则不会复制任何内容。

感谢您的时间。

最佳答案

首先,我不建议对生产代码执行此操作。请使用适当的数据共享机制。您可以使用给定的编译时已知大小的普通char array而不是std::string来解决此问题,它可以在头部为长字符串分配内存。

第二个,对于< 8,您将体验std::string的所谓SSO(Small String Optimization)。许多std::string实现现在确实进行了此优化。此值将不会始终为8。

第三个,对于> 8,您的结构副本中仅包含元数据(大小,容量,指向堆数据的指针)。所有数据都位于堆中。 Read此框架实现。

编辑:也阅读this post

数据共享:阅读this post

  • https://docs.microsoft.com/en-us/windows/desktop/Memory/creating-named-shared-memory
  • https://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html
  • 关于c++ - C++复制结构到另一个程序的资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52243069/

    10-11 23:00
    查看更多