0

我有一个由模板参数参数化的函数模板,以根据实例化的T内容赋予它不同的行为。T所需的具体变化非常简单,调用静态函数T::foo(some_args)就足够了,因为不涉及任何状态。

但是我不希望它foo出现在函数模板的正文中。

我宁愿打电话T(some_args);来避免语法噪音。我相信将函数调用运算符声明()为静态是不可能的(或者是吗?)。T没有状态,因此没有特定于实例的变量。

如果上述情况不可行,那么更有可能获得内联/优化(在 G++、Clang、ICC 中)

T::foo(some_args); // foo being a static function

或者

T()(some_args);  // operator () declared inline

我不知道汇编来检查输出,问题更多的是从学术/好奇心的角度来看,而不是实际表现。

T()(some_args)真的在运行时分配一个对象吗?还是通常优化了?

4

1 回答 1

3

简单的例子:

struct T
{
    int operator()(int i) const {
        return i+1;
    }   
};

int main()
{
    return T()(1);
}

使用 -O2 编译将产生:

(gdb) disassemble main
Dump of assembler code for function main():
   0x0000000000400400 <+0>:     mov    eax,0x2
   0x0000000000400405 <+5>:     ret
End of assembler dump.

即使使用 -O0 也不会创建临时的,以防您在 T 中使用隐式默认构造函数:

(gdb) disassemble main
Dump of assembler code for function main():
   0x00000000004004ec <+0>:     push   rbp
   0x00000000004004ed <+1>:     mov    rbp,rsp
   0x00000000004004f0 <+4>:     sub    rsp,0x10
   0x00000000004004f4 <+8>:     lea    rax,[rbp-0x1]
   0x00000000004004f8 <+12>:    mov    esi,0x1
   0x00000000004004fd <+17>:    mov    rdi,rax
   0x0000000000400500 <+20>:    call   0x400508 <T::operator()(int) const>
   0x0000000000400505 <+25>:    leave
   0x0000000000400506 <+26>:    ret
End of assembler dump.
于 2013-02-11T09:18:54.057 回答