功能指针vs直接调用cout

时间:2011-03-04 06:38:36

标签: c++ map

我正在进行C ++类分配,我想要一些输入。我不是在寻找“帮助”,因为我使用课堂作业作为练习编写“好”代码的借口,而且我正在讨论我正在处理的当前问题的两种解决方案。

我在STL地图中存储了大约4000个值。该程序的一个功能是打印出我的地图中的每个值。我有一个名为'driver'的类,它处理应用程序的内部逻辑并保存对map的引用。我有一个单独的用户界面类。

我要做的是将一个函数指针传递给我的驱动程序,该指针遍历地图并回调到我的UI类中的函数。在大约4000个函数调用中,这对于性能是否是一个坏主意?我应该咬紧牙关,只需在迭代时调用cout?我不愿意这样做,因为我试图让我的用户界面与我的程序逻辑和数据完全隔离。我知道最后它真的没关系,因为它只是一个类赋值,但假设这是我想长期维护的代码,那么“最佳”实践会在这里做什么?

2 个答案:

答案 0 :(得分:6)

简答:不要担心。 4k间接通话并不是什么大问题。如果您担心性能,请执行以下操作:

  • 以简单的方式编码
  • 表现好吗?完成。
  • 表现不好?使用分析器,如gprof,找出原因,然后只修复需要的内容

请记住,“过早优化是万恶之源。”

版本略长:您可以按如下方式定义回调:

template <typename IteratorType>
void my_multi_callback(iterator start, iterator end);

然后,驱动程序可以传递适当的map迭代器(描述要打印的事物的范围)。然后回调为每个元素执行输出,因此您可以避免重复的间接函数调用。

答案 1 :(得分:2)

我可能会传入一个迭代器。如果要将数据打印到cout,请传递ostream_iterator。稍后,如果您希望(例如)将数据从地图复制到矢量或其他类型,您可以只传递一个不同的迭代器(在这种情况下,可能是一个back_inserter)。

这提供了灵活性,但由于迭代器基本上是一个仿函数,它(通常)也消除了通过指针调用函数的开销。当您复制到可能无关紧要的标准输出时(通过指针调用函数的时间与实际写入流的时间相比非常小),但是当/如果您复制到其他地方时,速度可能更重要。