获取stringstream对象中的字符串地址

时间:2014-09-29 03:43:20

标签: c++ stringstream

是否可以获取指向存储在字符串流对象中的字符串的指针。基本上我想将字符串从该位置复制到另一个缓冲区.. 我发现我可以从代码下面得到长度

 myStringStreamObj.seekg(0, ios::end);
 lengthForStringInmyStringStreamObj = myStringStreamObj.tellg();

我知道我总能做myStringStreamObj.str().c_str()。但是我的探查器告诉我这段代码需要时间,我想避免它。因此我需要一些好的替代方法来获取指向该字符串的指针。

我的探查器还告诉我,代码的另一部分[{1}}也很慢。有人可以指导我这个。

拜托,我不能避免使用stringstream作为一个大代码的一部分,我无法改变/不允许更改。

2 个答案:

答案 0 :(得分:1)

答案是" no"。获取格式化字符串内容的唯一文档API是str()方法。

当然,无论您使用何种编译器或平台,都可能拥有自己特定的非标准和/或非文档化方法来访问{{{}的内部结构。 1}}对象;这可能会更快。因为您的问题没有指定任何特定的编译器或实现,所以我必须得出结论,您正在寻找一个符合标准的可移植答案;所以在这种情况下的答案几乎是一个"没有"。

如果任何特定的编译器或平台,即使是某些可能拥有"声誉的人,我真的会感到惊讶。对于中毒语言标准< cough> ,将提供任何替代方案。我希望所有实现都希望保持内部stringstream移动设备的私密性,以便在将来的版本中调整它们,而不会破坏二进制ABI兼容性。

您可能想要调查的唯一其他可能性是使用其迭代器获取stringstream的内容。当然,这是一种完全不同的机制,用于提取stringstream中的内容。并不像在一个银盘上用一种方法把你串起来一样简单直接;所以它可能会涉及一个相当重要的代码重写,它与返回的字符串一起使用。但有可能迭代stringstream中的内容可能会变得更快,因为可能不需要实现来分配新的stringstream实例std::string()的好处,并将所有内容都塞进其中。

在您的情况下,迭代是否会更快取决于您的实现str的工作方式以及编译器的效率。找出答案的唯一方法是继续进行,然后分析结果。

答案 1 :(得分:1)

我无法提供符合标准的便携式方法。

虽然您无法获得内部缓冲区,但您可以提供自己的缓冲区。

根据标准设置,std::stringbuf对象的内部缓冲区具有实现定义的行为。

cplusplus.com: std::stringbuf::setbuf()

正如我在 GCC 4.8.2 的实现中所发生的那样,行为是使用您提供的外部缓冲区,而不是内部std::string

所以你可以这样做:

int main()
{
    std::ostringstream oss;

    char buf[1024]; // this is where the data ends up when you write to oss
    oss.rdbuf()->pubsetbuf(buf, sizeof(buf));

    oss << "Testing" << 1 << 2 << 3.2 << '\0';

    std::cout << buf; // see the data
}

但我强烈建议您只做这样的事情作为(非常)临时措施,同时根据标准找出更有效的便携式东西。

说了所有我看过我的实现如何实现std::stringstream::str()并且它基本上返回其内部std::string,因此您可以直接访问并且在启用优化时应该完全优化函数调用。 所以这应该是首选方法。

相关问题