## 一:背景

相信大家在分析 dump 时,经常会看到 `WKS` 和 `SRV` 这样的字眼,如下代码所示:

``` C#

00007ffa`778a07b8 coreclr!WKS::gc_heap::segment_standby_list = 0x00000000`00000000
00007ffa`778a3870 coreclr!WKS::qpf = 0x989680
00007ffa`7789da30 coreclr!SVR::heap_select::numa_node_to_heap_map = unsigned short [1028]
00007ffa`7789f2d0 coreclr!SVR::gc_heap::should_expand_in_full_gc = 0n0

```

其实这就是命名空间,即 coreclr 在编译源码的时候,为 `WKS` 和 `SVR` 各编译了一份,不知道这么做的初衷是什么,这里就不管了,接下来看下 coreclr 中大概长啥样子。

``` C#

namespace WKS {
    #include "gcimpl.h"
    #include "gc.cpp"
}

namespace SVR {
    #include "gcimpl.h"
    #include "gc.cpp"
}

```

## 二:聊一聊 namespace

其实和 C# 的 namespace 本质差不多,都是起到隔离的作用,而且和 using 的配合使用和 C# 也是如出一辙,太有意思了。

### 1. 简单的隔离

在 C++ 中默认只有一个 namespace,所以相同的变量会出现冲突,解决办法就是用 namespace 隔离,参考如下代码:

``` C++

namespace WKS
{
    int a = 10;
    int b = 11;
}

namespace SRV {

int a = 100;
    int b = 101;
}

int main()
{
    printf("WKS::a= %d \n", WKS::a);
    printf("SRV::a= %d \n", SRV::a);
}

```

![](https://hxc-test.oss-cn-hangzhou.aliyuncs.com/PYZ/20220829231511.png)

当然还可以嵌套使用,比如改成这样。

``` C++

namespace WKS
{
    namespace V1 {
        int a = 10;
        int b = 11;
    }
}

int main()
{
    printf("WKS::a= %d \n", WKS::V1::a);
}

```

接下来看下汇编代码:

![](https://hxc-test.oss-cn-hangzhou.aliyuncs.com/PYZ/20220829231915.png)

哈哈,看到上面的 `WKS::V1::a` 感觉是不是挺舒服的,也特能理解目前的 `coreclr!WKS::xxx` 了, 不过这里有一个麻烦的地方,就是每次用 `a` 的时候都要输入很长的前缀,那有没有简化的方法呢? 当然有啦。

### 2. 使用 using 导入

接下来我们用 using 直接在 main 函数中定义字段,后续就不需要再写长长的前缀引用了,参考代码如下:

``` C++

namespace WKS
{
    namespace V1 {
        int a = 10;
        int b = 11;
    }
}

int main()
{
    using WKS::V1::a;

printf("WKS::V1::a1= %d \n", a);
}

```

![](https://hxc-test.oss-cn-hangzhou.aliyuncs.com/PYZ/20220829233323.png)

### 3. 使用 using 定义别名

定义别名这功能特别好,个人感觉已经完全替代以前的 `typedef` 功能,比如下面的代码是完全一样的。

``` C++

int main()
{
    typedef const char* PCHAR;

using PCHAR2 = const char*;

PCHAR ptr1 = "hello world1";

PCHAR2 ptr2 = "hello world2";
}

```

如果还不信的话,可以看下它们各自生成的汇编代码。

``` C++

PCHAR ptr1 = "hello world1";
00007FF79856183B  lea         rax,[string "hello world1" (07FF798569C10h)]  
00007FF798561842  mov         qword ptr [ptr1],rax

PCHAR2 ptr2 = "hello world2";
00007FF798561846  lea         rax,[string "hello world2" (07FF798569CE8h)]  
00007FF79856184D  mov         qword ptr [ptr2],rax

```

### 4. 使用 using namespace 导入

这个是最普遍的,我们对系统库的调用,无一不是用 using namespace 方式的,比如下面的代码。

``` C++

using namespace std;

int main()
{
    string str = "hello world";
}

```

接下来我们把 V1 导入到 main 方法中,这样就可以自由自在的使用 `WKS::V1` 中的内容了,参考如下代码:

``` C#

namespace WKS
{
    namespace V1 {
        int a = 10;
        int b = 11;
    }
}

int main()
{
    using namespace WKS::V1;

printf("a=%d, b=%d", a, b);
}

```

![](https://hxc-test.oss-cn-hangzhou.aliyuncs.com/PYZ/20220829234533.png)

好了,这就是对 namespace 的一点理解,本篇就说这么多吧,希望对你有帮助。

在 C# CLR 中学习 C++ 之了解 namespace相关推荐

  1. 浙大吴飞教授:尽管AlphaGo Zero已强大到从经验中学习模型,我也绝不赞同马斯克和霍金的威胁论,人才是智能的最终主宰

    记者 | 鸽子 在整个采访过程中,吴飞教授在回答中给人的最大感受是温和.儒雅.他没有激烈的言辞,也没有犀利的观点,不会一开始直接抛出自己的判断,而是将所有的提问,看作是一次学术上的严谨探讨,从问题本身 ...

  2. 《从缺陷中学习C/C++》——6.15 试图产生的指针很可能不存在

    本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.15节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&q ...

  3. rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习

    今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...

  4. 极客新闻——05、如何在工作中学习和成长?

    本文笔记全部来自<极客新闻>--新鲜的技术资讯.权威的趋势剖析.别样的技术洞察 关于如何进行自我学习的话题? 不同的人可能有不同的回答,总结起来就是阅读博客.参加技术大会.读书.利用闲暇时 ...

  5. 3D U-Net:从稀疏注释中学习密集的体积分割

    作者:Tom Hardy Date:2020-01-10 来源:3D U-Net:从稀疏注释中学习密集的体积分割

  6. 程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug

    来源:AI科技评论 本文约2700字,建议阅读10分钟 本文介绍了来自斯坦福大学的两位研究员研究了如何使用AI来自动修复程序,以期未来程序修复自动化可以大大提高编程和学习编程的效率. 众所周知,程序员 ...

  7. 《从缺陷中学习C/C++》——6.18 小结

    本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.18节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&q ...

  8. MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法

    说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都在它的源码 ...

  9. .Net CLR 中的同步机制(一): 互斥体

    随着软硬件技术的发展,无论是在Web服务或者云计算,还是单一的应用程序,串行方式编写的软件越来越少,我们总是可以看见并行的存在.但是并行并不是适合于每一种场景,也完全不是将工作扔到线程池中排队运行那么 ...

最新文章

  1. lucene 范围过滤
  2. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(一)
  3. android 从图片获取二维码
  4. QTP中对用户自定义环境变量的XML操作的几个函数
  5. 与虚拟现实技术相关联的计算机技术,虚拟现实技术与其他技术的关系是什么?-VR-形象思维VR...
  6. 如何在CentOS 7上安装Kubernetes Docker群集
  7. Web 2.0与云计算
  8. 新AirPods渲染图曝光:采用黑白灰金四种配色
  9. 比Magic Leap快一步,HoloLamp做到了裸眼观看全息图
  10. Go语言程序的数组初始化
  11. scala 构造_Scala咖喱和自动类型依赖的封闭构造
  12. php7.3手册_php7.3.8手册下载
  13. 标签、画像设计与模型落地
  14. IExplore.exe应用程序错误解决方法
  15. 利用 Python 分析 MovieLens 1M 数据集
  16. python绘图:散点图,密度图并保存成图片
  17. Repository epel is listed more than once in the configuration解决办法
  18. 算法分析-C语言描述
  19. 银河麒麟操作系统使用
  20. java线程池ThreadPoolExecutor类详解

热门文章

  1. 关于kbsync的研究
  2. 浏览器有些图片不能显示
  3. 计算可由time_t数据类型表示的最近时间。如果超出了这一时间将会如何?
  4. IBM中国武汉全球服务执行中心正式落成
  5. Hadoop理论——hdfs读、写流程
  6. JAVA 好用的文件备份代码
  7. 1月书讯:Hello 2021! (上)
  8. 向爱康家园投稿:将“女排精神”发扬到工作中去
  9. 辟谣、催债、倒闭.....2018年后,将再无创业黄金期!
  10. Github API:爬取Github用户数据