首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2014-02-14 06:05:40

使用参考What's the difference between “static” and “static inline” function?

inline指示编译器尝试将函数内容嵌入到调用代码中,而不是执行实际调用。

对于经常被调用的小函数,可以产生很大的性能差异。

但是,这只是一个“提示”,编译器可能会忽略它,即使没有使用关键字,大多数编译器也会尝试"inline“,作为优化的一部分,如果可能的话。

例如:

代码语言:javascript
运行
复制
static int Inc(int i) {return i+1};
.... // some code
int i;
.... // some more code
for (i=0; i<999999; i = Inc(i)) {/*do something here*/};

这个紧密的循环将在每次迭代中执行一个函数调用,函数内容实际上比编译器执行调用所需的代码要少得多。内联将本质上指示编译器将上面的代码转换为相当于:

代码语言:javascript
运行
复制
 int i;
 ....
 for (i=0; i<999999; i = i+1) { /* do something here */};

跳过实际函数调用并返回

显然,这是一个说明问题的例子,而不是一段真正的代码。

static指的是范围。在C中,这意味着函数/变量只能在同一个翻译单元中使用。

票数 -1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21771901

复制
相关文章

相似问题

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