gpt4 book ai didi

c++ - 定义析构函数可防止成员函数被内联

转载 作者:可可西里 更新时间:2023-11-01 17:58:47 25 4
gpt4 key购买 nike

我看到一个奇怪的问题,即如果我定义了析构函数,则成员方法不会被内联。

示例代码:

#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 月 17 日]

我更新了上面的代码以使其更简单(最初我正在处理我的 Vector 类)。

从成员方法返回基本类型似乎得到了正确的内联,只有当我返回我的类的实例时才会出现问题。

最佳答案

Visual Studio 将带有析构函数(无论是否为空)的类视为“复杂的”,它们更有可能放弃某些优化。如果您的类很简单并且对速度敏感,请使用默认的析构函数。

关于c++ - 定义析构函数可防止成员函数被内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com