定义析构函数可以防止成员函数内联
Defining a destructor prevents member functions being inlined
我看到一个奇怪的问题,如果我定义了析构函数,by成员方法就不会内联。
示例代码:
#include <cstdio>
class Foo
{
public:
Foo(int arg) : data(arg) {}
~Foo(void) {}
Foo bar(void) const { return Foo(7); }
int data;
};
int main(void)
{
Foo a(3);
Foo b = a.bar();
printf ("%i", b.data);
}
如果使用默认的析构函数,我会得到这样的结果:
main:
sub rsp,28h
lea rcx,[string "%i" (013FB8ADA0h)]
mov edx,7
call printf (013FB81068h)
xor eax,eax
add rsp,28h
ret
但是,如果我定义自己的空白析构函数,如上面的代码所示:
Foo::bar:
mov dword ptr [rdx],7
mov rax,rdx
ret
main:
sub rsp,28h
lea rdx,[b]
call Foo::bar (013FA11000h)
mov edx,dword ptr [b]
lea rcx,[string "%i" (013FA1ADA0h)]
call printf (013FA11088h)
xor eax,eax
add rsp,28h
ret
使用Visual Studio 2012(v110)编译为发布版本,但也尝试过Visual Studio 2010(v100)。我尝试设置/Ob2来帮助说服它内联该方法,但没有成功。
我对汇编不够熟悉,不知道它到底在做什么,也许明天我会想办法弄清楚,看看它是否能给我任何提示。有人能解释为什么定义一个空的析构函数会阻止方法内联吗?
编辑[2012/11]我更新了上面的代码,使其简单得多(最初我正在处理Vector类)。
从成员方法返回基元类型似乎得到了正确的内联,这只是当我返回类的实例时的问题。
Visual Studio将具有析构函数(无论是否为空)的类视为"复杂"类,它们更有可能放弃某些优化。如果您的类简单且对速度敏感,请使用默认的析构函数。
在VS 2010中,编译器似乎在编译时计算最终值,并将其加载到a
值的堆栈中
按以下方式修改代码确实启用了此优化,并定义了析构函数:
inline void operator = (const __m128 v)
{
data = v;
}
inline __m128 operator* (const Vector4& a) const
{
return _mm_mul_ps(data, a.data);
}
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法