| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1213 人关注过本帖, 1 人收藏
标题:gcc关于内联函数的问题
只看楼主 加入收藏
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
结帖率:96.55%
收藏(1)
已结贴  问题点数:20 回复次数:18 
gcc关于内联函数的问题
之前没注意过这个问题,今天才发现的。
刚刚用gcc编译了一个小程序,代码很简单,如下:
程序代码:
#include<stdio.h>
#include <time.h>

inline void PrintString(char * str);

int main(void)
{
    PrintString("This is the first line info.");
    PrintString("This is the second line info.");

    return 0;
}

inline void PrintString(char * str)
{
    printf("%s\n", str);
}


问题是不论生成的汇编代码,还是反汇编后的汇编代码都看不出内联的迹象。
编译命令如下:
gcc test.c -o test -O
gcc test.c -o test -O2
这两个命令编译后,结论都是一样,没有内联的迹象。
难道是我哪个地方写错了?
搜索更多相关主题的帖子: color 
2015-01-09 21:45
鱼儿海
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:77
专家分:194
注 册:2013-8-14
收藏
得分:0 
路过
2015-01-09 22:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
关于-O的用法 可以看这里
https://gcc.

简单来说是

什么都不用 相当于-O0 不优化
-O和-O1 最轻的优化
-O2 比较均衡的优化
-O3 比较费劲的优化
更大的数字无意义
-Os 基于-O2 但注重生成的程序的大小
-Og 在不影响调试的前提下优化
-Ofast 我的最爱 包含了-O3和-ffast-math 后者加速了浮点运算 是以损失精度为前提的 实际中就是不用80位的那一套东东 当然这个实际上不一定最快

对于楼主的问题 -O就能把楼主的这个inline内联了 如果你用-O0 有可能不内联
2015-01-10 00:26
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int add(int a, int b)
{
    return (a + b);
}

int main(void)
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    printf("%d\n", add(a, b));
    return 0;
}


这种程序看得更清楚 只要一看优化 函数调用就没有了
2015-01-10 00:31
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
回复 4楼 zklhp
恩,现在合适了,确实用-O就能内联了。
之前第一个编译命令不小心写错了。
2015-01-10 12:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用八画小子在2015-1-10 12:00:03的发言:

恩,现在合适了,确实用-O就能内联了。
之前第一个编译命令不小心写错了。

快给分
2015-01-10 12:08
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:0 
顶楼上

我不是砖家,要努力成为砖家。
2015-01-10 17:12
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
这才年初啊,都没分花了吗?
2015-01-10 23:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
《C++ Primer》在介绍inline的时候有两个【注意】:
1.内联说明(inline specification)对于编译器来说只是一个建议,编译器可以选择忽略这个建议。
2.内联函数应该在头文件中定义,这一点不同于其他函数。

另外还有一个【地雷】:在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译。

授人以渔,不授人以鱼。
2015-01-11 17:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在《C++ 编程规范》第8条“不要进行不成熟的优化”一节:“inline悖论。这个例子简单阐述了不成熟的微观优化所带来的隐形代价。分析器(profiler)能够通过函数的命中计数出色地告诉我们哪些函数应该但是没有标记为inline;然而,分析器在寻找哪些函数已经被标记为inline但是不应该标记方面,却极不擅长。太多的程序员习惯以优化的名义‘将inline作为默认选择’,这几乎总是以更高的耦合性为代价,而换来的好处到底如何却很可疑。(这里有一个前提,编写inline在所用的编译器上确实起作用。参阅[Sutter01]、[Sutter02]和[Sutter04])”

授人以渔,不授人以鱼。
2015-01-11 18:22
快速回复:gcc关于内联函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095827 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved