【C++11】inline与namespace使用|C语言的inline内联函数的作用

目录

inline与namespace使用

内联命名空间

内联空间应用场景

内联命名空间还有以下特点

C语言的inline内联函数的作用


inline与namespace使用

2021-07-30 14:23:12

内联命名空间

C++11中引入了内联命名空间(inline namespace),它的特点就是不需要使用using语句就可以直接在外层命名空间使用该命名空间内部的内容,而且无需使用命名空间前缀。

用途:默认放出新版接口,保留旧版的接口。

先看代码:

all::fun(1);         #V2017版的inline了,所以外层不加空间前缀调用的就是V2017的
all::V2018::fun(1);  #调用其他版本的就在函数名前指定加空间前缀
#include <iostream>
using namespace std;

namespace all
{
    //inline作用为默认调用
    inline namespace V2017
    {
        void fun(int num)
        {
            cout << "int" << "V2017" << endl;
        }
    }
    namespace V2018
    {
        void fun(int num)
        {
            cout << "int" << "V2018" << endl;
        }

        void fun(double num)
        {
            cout << "double" << "V2018" << endl;
        }
    }
}

void main()
{
    all::fun(1);
    all::V2018::fun(1);
    cin.get();
}

14.inline与namespace使用 - 喵小喵~ - 博客园

内联空间应用场景

默认放出新版接口,保留旧版的接口。

为了回答这个问题,我们举一个更加接近实际开发的例子。假设有如下类库代码:

使用时:

假设我们队类库进行了升级,同时又希望

  • 原代码不受影响,默认就是使用新类库的函数,
  • 如果有需要仍然可以使用就的类库

解决方法当然是使用内联命名空间。首先是对类库进行处理:

代码中为每个版本的类库定义了命名空间,同时将最新版本定义为内联命名空间。有了这样的准备之后,使用者代码可以是下面这样:

使用最新类库的时候,就好像没有定义过命名空间一样;如果实在是需要原来的类库,可以通用版本前缀加类名的方式。

还有一点很重要:由于隐式内联语法的存在,将来出现ver3的时候,只要将唯一的一个inline关键字移动到第一次出现的ver3定义之前就可以了!

作者一句话

内联命名空间的应用场景相当有限,但是一旦用上了,还是比较神奇的。

示例代码下载地址

https://github.com/xueweiguo/OOThinking/blob/master/20180524%20InlineNamespace.cpp

原文链接:https://blog.csdn.net/craftsman1970/article/details/82872497

内联命名空间还有以下特点

两处声明的命名空间同名,它们同属一个命名空间。这是C++命名空间从来就有的特性。

第一次声明命名空间时使用了inline关键字,这叫显式内联;第二次没有使用inline关键字,但是由于第一次已经声明了inline,这里声明的还是内联命名空间。这种情况成为隐式内联。

内联命名空间声明之后,就可以在外层命名空间不适用前缀而直接使用它们了。

上述代码中test_inline_namespace处在linline_namespace1的外层,所以可以直接使用Inline1和Inline2。test_inline_namespace2处在更外层,这时也只是需要使用外层命名空间inline_test前缀即可。

看起来inline_namespace就像不存在一样。

原文链接:https://blog.csdn.net/craftsman1970/article/details/82872497

@UESTC

参考:C++11新特性(79)-内联命名空间(inline namespace)_面向对象思考的博客-CSDN博客_内联命名空间

14.inline与namespace使用 - 喵小喵~ - 博客园

C语言的inline内联函数的作用

2012-10-08 23:03:12

 

编译器完成的,在调用处将函数展开,减少了调用函数时进栈和出栈,坏处是会增加代码段的大小(缺点:增加了编译后的二进制文件的大小),为了提高运行的速度,对于一些程序代码小,运行时间短但利用次数比较多的函数我们就定义为inline,对于短小的函数,可以省去CALL保存现场等操作,提高程序运行速度。

原文:C语言中内联函数的作用-hfm_honey-ChinaUnix博客

分类: C基础2011-08-27 03:19 1159人阅读 评论(3) 收藏 举报

[cpp] view plaincopy

  1. 关内联函数键字inline  

[cpp] view plaincopy

  1. void myprintf(int a)  
  2. {  
  3.   priintf("%d",a);  
  4. }  
  5.   
  6. int main()  
  7. {  
  8. for(i=0;i<100;i++)  
  9. myprintf(3);  
  10. }  


 

对于这个函数,在进行反复的打印3的过程中我们是不是要反复的调用myprintf(int a)这个函数,进函数和出函数是需要时间的,假设这个过程用时为4ms,而执行printf这个操作只需要2ms,那么在100次循环的过程中进出函数的时间比函数功能printf需要的时间还要长,这样很影响工作效率。于是,我们就想要如何去免去进出函数的过程呢?那么就可以声明inline这个关键字,有何用途?当我们声明了一个inline的函数时候,函数被调用的语句就被替换成了函数本身,进行了一个预处理

[cpp] view plaincopy

  1. int main()  
  2. {  
  3. for(i=0;i<100;i++)  
  4. void myprintf(3)  
  5. {  
  6. printf("%d",3);  
  7. }  
  8. return 0;  
  9. }  


 

这样一来我就非常明显的知道这个函数是干什么的了,就不需要去调用函数的定义部分,再通俗点讲,原来我要从家里去外面的商店去买冰淇淋(来回需要时间),现在商店就在我家里面了,那么我是不是省去了去商店的时间呢?但是相应的我这个家要很大(也就是所谓的空间要很大才能包含这个商店对吧?)这样就是用空间去换取了时间了。

内联函数在编译层面类似于宏替换。也就是说,程序执行过程中调用内联函数不需要入栈出栈,所以效率会提高。

[cpp] view plaincopy

  1. #include  
  2. inline int add(int x, int y)  
  3. {  
  4.     return x+y;  
  5. }  
  6.   
  7. int main()  
  8. {  
  9.  int i,j,k;  
  10.  printf("请输入两个整数的值:");  
  11.  scanf("%d%d",&i,&j);  
  12.  k=add(i,j);  
  13.  printf("k=%d\n",k);  
  14.  return 0;  
  15.   
  16. }  

posted on 2022-10-04 01:23  bdy  阅读(162)  评论(0编辑  收藏  举报

导航