直接写入 std::string 内部缓冲区

2024-02-21

我正在寻找一种跨 DLL 边界将一些数据填充到字符串中的方法。因为我们使用不同的编译器,所以我们所有的dll接口都是简单的char*。

是否有正确的方法将指针传递到 dll 函数中,以便它能够直接填充字符串缓冲区?

string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() );   // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() );    // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() );       // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );

看起来最有希望的是 &stringToFillIn[0] ,但考虑到您认为 string::data() == &string[0] ,这是一种正确的方法吗?看起来不一致。

或者最好接受额外的分配并避免这个问题:

vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );

我不确定该标准能否保证 a 中的数据std::string被存储为char*。我能想到的最便携的方法是使用std::vector,保证将其数据存储在连续的内存块中:

std::vector<char> buffer(100);
FunctionInDLL(&buffer[0], buffer.size());
std::string stringToFillIn(&buffer[0]);

这当然需要将数据复制两次,效率有点低。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直接写入 std::string 内部缓冲区 的相关文章