鱼C论坛

 找回密码
 立即注册
查看: 2743|回复: 2

这个程序用内联函数用的对吗

[复制链接]
发表于 2018-1-3 23:20:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
using namespace std;
int sorting(int a,int b,int c);
int main()
{
    int a=21,b=15,c=22;
    sorting(a,b,c);
    cout<<sorting(a,b,c);
    return 0;
}
inline int sorting(int a,int b,int c)
{
    if(a>b&&a>c) return a;
    if(b>a&&b>c) return b;
    if(c>a&&c>b) return c;
}内联函数正确使用了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-4 00:13:46 | 显示全部楼层
有没有内联,需要看反汇编代码才知道
即使是加了inline,没有打开编译选项也不行
同一段代码
#include<iostream>

using namespace std;

inline int sorting(int a, int b, int c)
{
        if((a > b) && (a > c)) return a;
        if((b > a) && (b > c)) return b;
        
        return c;
}

int main(void)
{
        int a = 10, b = 20, c = 30;

        cout << sorting(a, b, c);

        return 0;
}

开内联
        cout << sorting(a, b, c);
00401773 8B 45 F8             mov         eax,dword ptr [a]  
00401776 3B 45 EC             cmp         eax,dword ptr [b]  
00401779 7E 13                jle         main+4Eh (040178Eh)  
0040177B 8B 4D F8             mov         ecx,dword ptr [a]  
0040177E 3B 4D E0             cmp         ecx,dword ptr [c]  
00401781 7E 0B                jle         main+4Eh (040178Eh)  
00401783 8B 55 F8             mov         edx,dword ptr [a]  
00401786 89 95 14 FF FF FF    mov         dword ptr [ebp-0ECh],edx  
0040178C EB 24                jmp         main+72h (04017B2h)  
0040178E 8B 45 EC             mov         eax,dword ptr [b]  
00401791 3B 45 F8             cmp         eax,dword ptr [a]  
00401794 7E 13                jle         main+69h (04017A9h)  
00401796 8B 4D EC             mov         ecx,dword ptr [b]  
00401799 3B 4D E0             cmp         ecx,dword ptr [c]  
0040179C 7E 0B                jle         main+69h (04017A9h)  
0040179E 8B 55 EC             mov         edx,dword ptr [b]  
004017A1 89 95 14 FF FF FF    mov         dword ptr [ebp-0ECh],edx  
004017A7 EB 09                jmp         main+72h (04017B2h)  
004017A9 8B 45 E0             mov         eax,dword ptr [c]  
004017AC 89 85 14 FF FF FF    mov         dword ptr [ebp-0ECh],eax  
004017B2 8B F4                mov         esi,esp  
004017B4 8B 8D 14 FF FF FF    mov         ecx,dword ptr [ebp-0ECh]  
004017BA 51                   push        ecx  
004017BB 8B 0D 98 A0 40 00    mov         ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (040A098h)]  
004017C1 FF 15 9C A0 40 00    call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (040A09Ch)]  
004017C7 3B F4                cmp         esi,esp  
004017C9 E8 54 F9 FF FF       call        __RTC_CheckEsp (0401122h)  

关内联
        cout << sorting(a, b, c);
00C71E23 8B 45 E0             mov         eax,dword ptr [c]  
00C71E26 50                   push        eax  
00C71E27 8B 4D EC             mov         ecx,dword ptr [b]  
00C71E2A 51                   push        ecx  
00C71E2B 8B 55 F8             mov         edx,dword ptr [a]  
00C71E2E 52                   push        edx  
00C71E2F E8 3C F5 FF FF       call        sorting (0C71370h)  
00C71E34 83 C4 0C             add         esp,0Ch  
00C71E37 8B F4                mov         esi,esp  
00C71E39 50                   push        eax  
00C71E3A 8B 0D 98 A0 C7 00    mov         ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0C7A098h)]  
00C71E40 FF 15 9C A0 C7 00    call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0C7A09Ch)]  
00C71E46 3B F4                cmp         esi,esp  
00C71E48 E8 D5 F2 FF FF       call        __RTC_CheckEsp (0C71122h)  

另外,我还发现了一个比较有趣的问题
在开内联时,有一些编译警告会失效(应该是一些,不是全部)
例如
#include<iostream>

using namespace std;

inline int sorting(int a, int b, int c)
{
        if((a > b) && (a > c)) return a;
        if((b > a) && (b > c)) return b;
        
        //return c;
}

int main(void)
{
        int a = 10, b = 20, c = 30;

        cout << sorting(a, b, c);

        return 0;
}

关内联时
编译有一个警告
warning C4715: “sorting”: 不是所有的控件路径都返回值

开内联时就没有警告
^_^


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-4 00:17:17 | 显示全部楼层
代码编译时,没有警告(开内联)
#include<iostream>

using namespace std;

inline int sorting(int a, int b, int c)
{
        if((a > b) && (a > c)) return a;
        if((b > a) && (b > c)) return b;
        
        //return c;
}

int main(void)
{
        int a = 10, b = 20, c = 50;

        cout << sorting(a, b, c);

        return 0;
}

输出
-858993460请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表