首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问静态变量时内联函数和静态内联函数的区别

访问静态变量时内联函数和静态内联函数的区别
EN

Stack Overflow用户
提问于 2014-02-14 05:59:29
回答 4查看 1.1K关注 0票数 1

在阅读其他代码时,我遇到了一个有趣的案例。

在头文件中,定义了静态变量和内联函数,简化如下:

代码语言:javascript
运行
复制
static int ply;

inline int WTM(){return ply;}

这个函数在包含这个头的其他一些cpp文件中调用。

代码语言:javascript
运行
复制
cout << ply << " " << WTM();

奇怪的是,在调用该函数的地方,内联函数中的变量ply与它之前的变量在函数外部有不同的值。

输出为0 1;

我检查了所有的文件,plyWTM()都只有一个定义。

在此之后,我将代码更改为:

代码语言:javascript
运行
复制
static int ply;

static inline int WTM(){return ply;}

这两种价值是一样的。

我的编译器是g++ (GCC) 4.4.7,具有默认设置。

我搜索了这个现象,并找到了这两个链接:Difference between an inline function and static inline functionhttp://gcc.gnu.org/onlinedocs/gcc/Inline.html,但仍然不明白为什么会发生这种情况(尤其是为什么在第一种情况下它们会有不同的值)。我想知道是否有人能告诉我编译器将如何展开这两段代码(我试过使用-E,但它似乎没有使用内联函数)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-14 06:02:28

这是因为静态变量将在包含头文件的所有转换单元中分别定义,但(非静态)函数只定义一次。因此,您有多个变量副本,但只有一个函数副本。函数将使用变量的哪个副本?我不知道,我认为这要么是未定义的行为,要么是实现的定义(必须阅读规范)。

当您将函数声明为static时,它的不同之处在于,它将在每个翻译单元中定义为与变量相同的变量,因此只能访问该转换单元的变量。

票数 5
EN

Stack Overflow用户

发布于 2014-02-14 06:19:39

第一次使用没有静态的内联函数,是未定义的行为。

标准3.2.6

在一个程序中,可以有多个具有外部链接的内联函数的定义(7.1.2),但每个定义必须出现在不同的翻译单元中,并且定义必须满足以下要求: -D的每一定义应由相同的记号序列组成; -在D的每一定义中,根据3.4查阅的相应名称应指在D定义范围内界定的实体,或指同一实体, -. 如果D的定义满足所有这些要求,那么程序的行为就像D有一个单一的定义一样。如果D的定义不满足这些要求,则该行为是未定义的。

对于您第一次使用外部内联函数(没有静态的),在查找名称之后的名称针对不同的翻译单元引用不同的实体。

票数 0
EN

Stack Overflow用户

发布于 2014-02-14 06:26:36

对此还有另外一个解释:

通过声明函数inline,您可以指导编译器将该函数的代码集成到其调用方的代码中。

这通过消除函数调用开销使执行速度更快;此外,如果任何实际的参数值是常量的,那么它们的已知值可能允许在编译时进行简化,从而不需要包含所有内联函数的代码。

对代码大小的影响是不可预测的;使用函数inline时,对象代码可能更大或更小,这取决于具体情况。

Inline函数是一种优化,它只在优化编译中真正“工作”。如果不使用-O,则没有一个函数是真正的inline

对于static inline function

当一个函数同时是inlinestatic时,

如果对函数的所有调用都集成到调用方中,并且函数的地址从未被使用,那么函数自己的汇编程序代码就不会被引用。

在这种情况下,除非指定选项compiler,否则-fkeep-inline-functions.实际上不会输出该函数的汇编程序代码。

有些调用由于各种原因不能集成(特别是,函数定义之前的调用不能集成,定义中的递归调用也不能集成)。

如果存在非集成调用,则该函数将像往常一样编译为汇编程序代码。如果程序引用其地址,则函数也必须像往常一样编译,因为不能是inlined

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21771901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档