2010-12-02 133 views
2

<functional>中的大部分函数都使用函子。如果我写这样一个结构:编译器优化问题

struct Test 
{ 
    bool operator() 
    { 
     //Something 
    } 
    //No member variables 
}; 

是否有perf打击?是否会创建Test的对象?或者编译器能否优化对象?

+0

为什么不是一个简单的函数而不是一个函数因为函数中没有成员变量? – Chubsdad 2010-12-02 06:06:35

+0

@Chubsdad:因为这个问题的答案中提到的'诀窍'。 http://stackoverflow.com/questions/442026/function-overloading-by-return-type – nakiya 2010-12-02 06:08:49

回答

3

海湾合作委员会至少可以优化对象创建和内联你的函数,所以你可以期待与手工制作循环一样的性能。你必须使用-O2进行编译。

3

是的,如果需要的话,编译器可以优化“对象创建”(在这种情况下是微不足道的)。但是如果你真的关心你应该编译你的程序并检查汇编代码。

0

该结构没有“使用”,因此目前的代码,它仍然只是一个定义(并且不占用空间)。

如果您创建类型为Test的对象,它将占用非零空间。如果编译器可以推断没有任何地址(或任何类似地址),则可以优化空间使用率。

3

即使编译器有一个糟糕的一天,并以某种方式无法弄清楚如何优化(这是非常简单的优化去) - 没有数据成员和没有构造函数的“性能命中”,以“创建一个对象“最多只有一条指令(如果编译器还不知道如何内联使用函子的函数调用)来增加堆栈指针(因为每个对象都必须加上以复制对象有一个唯一的地址)。 “创建对象”是便宜。需要花费时间的是,通过new分配内存(因为操作系统必须被请求访问内存,并且必须搜索未被别的东西使用的连续块)。把东西放在堆栈上是微不足道的。