我看到某人的代码片段如下所示:
改变之前:
void pal::type3_message::debug_print(std::ostream & out) const
{
out << "### type3_message:" << '\n'
<< pal::as_hex_dump(as_bytes())
<< "lm_response = " << pal::as_hex_string(lm_response_)
<< "\nnt_response = " << pal::as_hex_string(nt_response_)
<< "\ndomain = " << domain_
<< "\nuser = " << user_
<< "\nworkstation = " << workstation_
<< "\nsession_key = " << pal::as_hex_string(session_key_)
<< std::hex << std::setw(8) << std::setfill('0')
<<"\nssp_flags = " << ssp_flags_;
}
更改后:
std::string pal::type3_message::debug_print() const
{
std::ostringstream buf;
buf << "### type3_message:" << '\n'
<< pal::as_hex_dump(as_bytes())
<< "lm_response = " << pal::as_hex_string(lm_response_)
<< "\nnt_response = " << pal::as_hex_string(nt_response_)
<< "\ndomain = " << domain_
<< "\nuser = " << user_
<< "\nworkstation = " << workstation_
<< "\nsession_key = " << pal::as_hex_string(session_key_)
<< std::hex << std::setw(8) << std::setfill('0')
<<"\nssp_flags = " << ssp_flags_;
return buf.str();
}
我不太清楚上面的变化,有人能告诉我应该怎么做以及它的深刻意义吗?期待回应并欣赏它。
答案 0 :(得分:1)
我不确定你在问什么,所以我只是解释代码示例的作用以及两个函数之间的主要区别:
void pal::type3_message::debug_print(std::ostream & out) const
此函数将消息写入out
参数引用的输出流。它没有回报价值。
std::string pal::type3_message::debug_print() const
此函数似乎输出相同的消息,但不是将其写入流,而是将消息存储在字符串中。该字符串由函数返回。
两个函数的实现看起来非常相似,因为第二个函数在内部使用临时std::ostringstream
。这是仅在内存中存在的流。相反,您可以将std::ofstream
之类的文件流传递给第一个函数。
如果您想了解更多信息,请澄清您的问题。
答案 1 :(得分:0)
可以告诉我应该怎么做以及它的深层意义?
第一种方法接收std :: ostream&amp;参数,并将10多个不同的文本块流入其中。
第二种方法将相同的10个文本块流式传输到本地创建的(自动var)std :: ostringstream。这会在返回字符串之前连接块。
可能的用法示例(在std :: cout上实现相同的输出):
pal::type3_message::debug_print(std::cout);
std::cout << std::endl;
和
std::cout << pal::type3_message::debug_print() << std::endl;
我更喜欢std :: stringstream方法,但我已经使用了它们。
在第一种方法中,线程可以被中断&#39;在更多的地方(10个之间)可能会影响非私人流的努力。这会导致问题吗?我没有在桌面上进行调查。
第二种方法完成连接,然后返回一个字符串。之前的所有中断点仍然存在,但没有一个会影响到共享流目标std :: cout的传递。请注意,此路径中仍有1个(或可能是2个)中断位置(附加字符串)。不过,这可能不太可能产生明显的问题。
在我曾经使用过的嵌入式系统中,由于它有驱动程序,第二种方法明显更好(在使用过程中线程中断方面)并且似乎在外出通道上不需要互斥保护。
在Ubuntu上,我添加了mutex guard来访问std :: cout ...以避免混合使用&#39;文字,虽然我没有确认这篇文章所描述的改变是否足够。
我有一个带有循环缓冲区的in-ram-log,并且该共享资源有一个互斥锁。多线程从不会导致同一日志出现任何问题。
注意:根据帖子问题,我发现在std :: hex或std :: setw方面的流量工作没有区别,两者的使用方式相同。
每年7月2日更新,评论
我同意&#39;之后&#39;是我喜欢的。
我不认识这句话&#34;不要搞乱借来的东西&#34;。我查看并决定谷歌关于这句话的报告没有软件相关性。
但它让我想起了我听过的一个可能相关的警告,&#34;代码就像一个洋葱&#34;。那个向我重复这个的人(痴迷地)拒绝修复&#39;事情(例如崩溃),因为,我猜测,他担心任何改变可能会破坏行为&#39;以无法察觉的方式。因此,他研究了所有洋葱层&#39;直到他确定在发生代码更改之前不会发生任何不好的事情。 &#39;通过分析瘫痪&#39;浮现在脑海中。
显然,我对尝试其他东西(以及测试,测试,测试......)更加宽容。崩溃很容易解决,崩溃肯定在理解洋葱的更深层次方面取得了进展。