1

我正在查看Boost 网站上的HTTP Server 3示例。连接类中有以下代码:

boost::tribool result;
boost::tie(result, boost::tuples::ignore) = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);

声明parse

template <typename InputIterator>
boost::tuple<boost::tribool, InputIterator> parse(request& req, InputIterator begin, InputIterator end)

我相信目标是将返回的值复制tribool到局部变量。boost::tie但是,如果可以写类似的东西,那么通过临时对象 () 来做这件事有什么意义

boost::tuple<boost::tribool, char*> result = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
// Our tribool is available via result.get<0>();

?

4

4 回答 4

10

好处不是性能,而是实用性和可读性:由于您对返回的第二个对象不感兴趣parse,因此无需保留它。最好完全忽略它,只得到你真正感兴趣的结果,即tribool. 以下使用 的代码result会更清晰。

事实上,当一个函数返回多个数据时,将其“拆分”以分别获取单个元素通常很有用(在可读性方面)。例如,考虑std::set<T>::insert,它返回元素的迭代器以及指示它是否是新插入的布尔值。您觉得以下哪个代码更清晰:

std::set<int> s;
std::pair<std::set<int>::iterator, bool> res = s.insert(42);

if (res.second)
{
    doSomething(res.first);
}

对比

std::set<int> s;
std::set<int>::iterator itInsertedElement;
bool isNewlyInserted;

tie(itInsertedElement, isNewlyInserted) = s.insert(42);

if (isNewlyInserted)
{
    doSomething(itInsertedElement);
}

在我看来,后者更容易阅读。

于 2012-10-09T08:48:49.177 回答
3

我认为这只是语义上的考虑。

  1. 结果的第二个元素被明确忽略,更明显的是尾随.get<0>()
  2. result变量只绑定有用的部分,不需要其他变量。

此处的性能不应受到影响,因为编译器会将其视为:

 boost::tuple<boost::tribool, char*> __tmp = request_parser_.parse(/**/);

 boost::trilbool result;
 boost::tie(result, boost::tuples::ignore) = __tmp;

然后优化器将负责消除杂物并尽可能减少它。

于 2012-10-09T08:50:35.053 回答
3

我认为他们使用tie主要是为了方便。如果您不需要InputIterator,只需要tribool值,为什么要创建命名变量?

这:

boost::tribool result;
boost::tie(result, boost::tuples::ignore) = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);

变成这样:

boost::tuple<boost::tribool, char*> results = request_parser_.parse(request_, buffer_.data(), buffer_.data() + bytes_transferred);
boost::tribool result = boost::get<0>(results); // or you can use boost::get<0>(results) everywhere you use it.

而你在堆栈上完全没用results

从返回的临时值boost:tie可能会由编译器优化,因此不应该有任何内存开销。

于 2012-10-09T08:52:22.327 回答
0

我怀疑是否存在任何可测量的性能差异(当然不是与 IO 成本相比),但简单地引用result而不是使用get<0>()将其从元组中取出更方便。

于 2012-10-09T08:47:11.987 回答