编译器优化问题

时间:2010-12-02 06:03:47

标签: c++ optimization

<functional>中的大部分功能都使用仿函数。如果我写这样的结构:

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

即使编译器有一个糟糕的一天,并且不知何故无法弄清楚如何优化它(它随着优化而变得非常简单) - 没有数据成员而没有构造函数“性能命中”到“创建对象”最多只有一条指令(加上可能复制对象,如果编译器也没有弄清楚如何内联使用函子的函数调用)增加堆栈指针(因为每个对象必须有一个唯一的地址)。 “创建对象”便宜。需要时间的是分配内存,通过new(因为必须为内存请求操作系统,并且必须搜索未被其他内容使用的连续块)。将东西放在堆栈上是微不足道的。

答案 2 :(得分:3)

GCC至少可以优化对象创建并内联您的仿函数,因此您可以期待与手工制作的循环一样的性能。对于cource,您必须使用-O2进行编译。

答案 3 :(得分:0)

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

如果创建类型为Test的对象,则会占用非零空间。如果编译器可以推断出没有任何东西需要它的地址(或类似的东西),那么可以自由地优化空间使用。