<functional>
中的大部分功能都使用仿函数。如果我写这样的结构:
struct Test
{
bool operator()
{
//Something
}
//No member variables
};
是否有击打?是否会创建Test
的对象?或者编译器可以优化对象吗?
答案 0 :(得分:3)
是的,如果需要,编译器可以优化“对象创建”(在这种情况下这是微不足道的)。但是如果你真的在乎你应该编译程序并检查汇编代码。
答案 1 :(得分:3)
即使编译器有一个糟糕的一天,并且不知何故无法弄清楚如何优化它(它随着优化而变得非常简单) - 没有数据成员而没有构造函数“性能命中”到“创建对象”最多只有一条指令(加上可能复制对象,如果编译器也没有弄清楚如何内联使用函子的函数调用)增加堆栈指针(因为每个对象必须有一个唯一的地址)。 “创建对象”便宜。需要时间的是分配内存,通过new
(因为必须为内存请求操作系统,并且必须搜索未被其他内容使用的连续块)。将东西放在堆栈上是微不足道的。
答案 2 :(得分:3)
GCC至少可以优化对象创建并内联您的仿函数,因此您可以期待与手工制作的循环一样的性能。对于cource,您必须使用-O2进行编译。
答案 3 :(得分:0)
结构没有“使用”,因此代码目前仍然只是一个定义(并且不占用空间)。
如果创建类型为Test
的对象,则会占用非零空间。如果编译器可以推断出没有任何东西需要它的地址(或类似的东西),那么可以自由地优化空间使用。