2014-11-14 77 views
1

考虑follwing C++代码的情况下不增加:码量的内联函数

#include <iostream> 

using namespace std; 

class A 
{ 
    int a; 
    public: 
     A(); 
     void f(); 
}; 

A::A() 
{ 
    cout<<"Constructor"<<endl; 
} 

inline void A::f() 
{ 
    cout << "hello\n"; 
} 

int main() 
{ 
    A a; 
    a.f(); 
    a.f(); 
    a.f(); 
    return 0; 
} 

这里的函数f由我做内联。现在我运行size命令来查找文本部分的大小。我得到了以下输出:

text  data  bss  dec  hex filename 
2148  312  144 2604  a2c ./1 

现在我通过从其定义中删除inline关键字,使函数f非内联。在我又跑了大小命令:

text  data  bss  dec  hex filename 
2148  312  144 2604  a2c ./1 

所以,文本部分的大小是在两种情况下相同的,虽然我预计大小为更大的情况下,f为直列其调用只是通过更换内联代码。

那么,这可能是什么原因?有没有任何例子的尺寸会改变?

+0

'inline'是一个建议,不能保证编译器实际上会内联你的函数。 – 2014-11-14 17:41:45

+0

@CaptainObvlious:但是如果代码大小增加,增加将是可见的。它与对齐有什么关系? – tapananand 2014-11-14 17:42:44

+0

您的编译器可能会忽略'inline',至少就决定是否为内联函数生成代码(虽然inline也影响单定义规则的方式不能忽略)。顺便说一句,几乎愚弄:http://stackoverflow.com/q/1759300/179910 – 2014-11-14 17:43:14

回答

1

在这种情况下,这可能是链接时间优化的情况。这通过使用g++ -S 1.cpp 编译代码的事实得到证实。内联的汇编代码的大小比非内联的汇编代码的大小要大。所以,实际的行为可以在汇编中看到,但在链接时间之后不能在最终执行。

0

内联只是一个对编译器的请求。它可能会也可能不会像内联那样执行该功能。

+0

这几天,它甚至不是一个请求。现代编译器将“内联”说明符的作用限制为只放宽ODR。至于实际内联,他们更喜欢他们自己的判断。 – ach 2014-11-14 17:50:51

3

inline不影响函数调用是否内联(尽管它可能或可能不影响编译器的决定)。只要不改变程序的行为,编译器就可以根据“as-if”规则自由地内联任何函数调用,任何优化都是允许的。

inline的目的是允许您定义头中的函数,给出多个定义(每个翻译单元中包含头的一个定义),否则这些定义将被One Definition Rule禁止。对于某些编译器,这是允许内联函数调用所必需的 - 除非它具有链接时优化器,编译器只能在定义可用时内联调用函数。

如果你使用GCC,那么就可以用它来防止内联,如果你想看到效果的属性:

void f() __attribute__ ((noinline)); 
+0

甚至指定函数f的属性不会显示效果。请帮忙!! – tapananand 2014-11-14 17:50:48

+0

@TapanAnand:您是否在优化建设?它可能不会内联函数。 – 2014-11-14 17:54:06

2

既然你在一个文件中的所有代码,最有可能的编译器在两种情况下内联A::f

Here is a demo在您的代码中显示此内容。

比检查文本段大小更好,您可以指定-S编译器选项并比较两个版本的汇编输出。