显式初始化的效率

时间:2010-08-24 16:50:34

标签: c++ performance initialization explicit

我有一个类,它有一个带const char*的构造函数。它是:

c::c(const char* str) {
    a = 32;
    f = 0;
    data = new char[strlen(str)];
    memcpy(data, str, strlen(str));
}

以及其中一个的功能:

int foo(c& cinst);

您可以通过传递c

的实例来调用此函数
c cinst("asdf");
foo(cinst);

或者,因为我们有明确的初始化,你可以这样做:

foo("asdf");

通过传递构造函数“asdf”生成c,然后将生成的对象传递给foo

然而,这似乎比仅仅重载foo以获取const char*的效率要低得多。是否值得为速度进行过载,或者性能影响如此之小以至于浪费空间来实现过载?我试图让我的程序尽可能快,所以速度是一个重要因素,尺寸也是如此,但不是那么多。

4 个答案:

答案 0 :(得分:1)

foo const char*会对c做些什么?如果它只是让它拥有自己的char*对象,那么就没有意义了。

如果要直接使用foo(并且现有的char*只是从c对象中拉出{{1}},那么最好是写一个重载。

答案 1 :(得分:0)

它不会花费零时间,因此它是您必须采取的权衡之一,速度与api清晰度。当然它取决于你在函数中做了什么,采用const char *,你在构建一个c对象吗?在这种情况下,只需提供带有c类接口的函数。

答案 2 :(得分:0)

使用分析器可以最好地回答这类问题。 查看它的汇编代码也可能提供线索。

答案 3 :(得分:0)

这是情境化的。它实际上取决于在给定情况下构造函数内部实际发生了多少以及实际执行该代码的次数。

在您给出的示例中,这些是构造函数中非常简单的操作。在任何合理的现代处理器上,这些操作都会非常快。因此,除非代码每秒执行次数或更多次,否则我甚至不会担心它。 (当然“巨大”的价值取决于你期望在哪种机器上运行。对于这个构造函数,在典型的桌面处理器上,我甚至不会担心,直到它达到至少这个规模每秒数十万次。)

如果此构造代码确实运行了很多次,那么您仍然应该对其进行分析并确定它是否与程序中发生的其他事件相比具有明显的影响。优化是一件棘手的事情。有时你的直觉所说的低效率实际上对最终结果几乎没有影响。测量始终是为了确定您应该在哪里花时间最有效地使程序运行得更快。