C++ 正在获取stringstream对象中字符串的地址

C++ 正在获取stringstream对象中字符串的地址,c++,stringstream,C++,Stringstream,是否可以获取字符串流对象中存储的字符串的指针。基本上我想把字符串从那个位置复制到另一个缓冲区。。 我发现我可以从下面的代码中得到长度 myStringStreamObj.seekg(0, ios::end); lengthForStringInmyStringStreamObj = myStringStreamObj.tellg(); 我知道我总是可以做myStringStreamObj.str().c_str()。然而,我的分析器告诉我,这段代码需要时间,我想避免它。因此,我需要一些好的

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

 myStringStreamObj.seekg(0, ios::end);
 lengthForStringInmyStringStreamObj = myStringStreamObj.tellg();
我知道我总是可以做
myStringStreamObj.str().c_str()
。然而,我的分析器告诉我,这段代码需要时间,我想避免它。因此,我需要一些好的替代方法来获取指向该字符串的指针

我的分析器还告诉我,代码的另一部分do
myStringStreamObj.str(std::string())
也很慢。有人能在这方面指导我吗

拜托,我不能避免stringstream作为一个大代码的一部分,我不能更改/没有更改权限

答案是“不”。获取格式化字符串内容的唯一有文档记录的API是
str
()方法

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

事实上,如果任何特定的编译器或平台,甚至一些可能因毒害语言标准而享有“声誉”的人,会提供任何替代方案,我会感到惊讶。我希望所有的实现都更愿意将内部
stringstream
moving gears保持私有,以便在未来的版本中对它们进行调整和修改,而不会破坏二进制ABI兼容性

您可能要研究的唯一其他可能性是使用迭代器获取
stringstream
的内容。当然,这是一种完全不同的机制,用于提取
stringstream
中的内容;这并不像在银盘上调用一个给你字符串的方法那么简单;因此,可能需要对使用返回字符串的代码进行相当重要的重写。但是,迭代
stringstream
中的内容可能会更快,因为据推测,实现不需要仅仅为了
str
()的好处而分配一个新的
std::string
实例,并干扰其中的所有内容


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

我无法提供一种可移植、符合标准的方法。

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

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

正如在我的GCC4.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
}
intmain()
{
std::ostringstream oss;
char buf[1024];//这是写入oss时数据的结尾
rdbuf()->pubstebuf(buf,sizeof(buf));

OSS为什么不能避免String流,主要问题的答案是“不可移植代码”。没有C++标准保证String String包含任何特定的表示字符串。“……代码> MyString流目标。Stry.(cString)(< /代码>)。但是我的分析器告诉我这个代码需要时间……”-应该可以忽略不计-您是否启用了优化?它是内联的吗?
myStringStreamObj.str(std::string())
-您是否尝试过使用临时的
stringstream
(可能更好或更差,但值得一试)?(无需使用
seekg
/
tellg
工具来获取大小-您可以执行
const std::string&s=myStringStreamObj.str();
然后使用
s.size()
s.c_str()
s.data()
)您需要将
stringstream
的内容复制到哪个缓冲区?如果它是另一个基于iostream的缓冲区(例如,filebuf),您可以执行类似
dest的操作