我正在寻找一种方法将一些数据填充到跨越DLL边界的字符串中。因为我们使用不同的编译器,所以我们所有的dll接口都是简单的char *。直接写入std :: string内部缓冲区
是否有正确的方法将指针传入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],但一个正确的方式来做到这一点,因为你会认为字符串::数据()== &串[0]?看起来不一致。
还是更吞下一个额外的配置和回避的问题:
vector<char> vectorToFillIn(100);
FunctionInDLL(&vectorToFillIn[0], vectorToFillIn.size());
string dllGaveUs(&vectorToFillIn[0]);
在效率方面,如果启动使用std ::矢量作为缓冲,你将遇到一种不同类型的性能问题,其中向量的每个元素都被逐一初始化。如果你保留一个32K的缓冲区(这并不是那么重要),你将花费大量的CPU时间来初始化这个缓冲区。如果你只是需要一个连续的内存块,你会更好的简单地使用一个数组new new char []将它与std :: unique_ptr或其他一些RAII模式结合起来,你可以很好地去,但不要使用std ::除非你绝对需要初始化每个元素。 – 2013-03-07 12:55:49
使用http://stackoverflow.com/questions/11149665/c-vector-that-doesnt-initialize-its-members中的矢量技巧。 –
2013-06-06 16:26:03
“我不确定标准保证`std :: string`中的数据存储为`char *`。”它有保证。 `std :: string`使用`char`。 http://en.cppreference.com/w/cpp/string/basic_string – cambunctious 2016-07-13 20:09:37