聊一聊 C++ 中的 namespace

一:背景

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

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 在编译源码的时候,为 WKSSVR 各编译了一份,不知道这么做的初衷是什么,这里就不管了,接下来看下 coreclr 中大概长啥样子。

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 隔离,参考如下代码:

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);
}
8b19ae59139e0f24865cfb9f8c439b43.png

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

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

接下来看下汇编代码:

c83a1e076c49b329781778ef539ae33e.png

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

2. 使用 using 导入

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

namespace WKS
{namespace V1 {int a = 10;int b = 11;}
}int main()
{using WKS::V1::a;printf("WKS::V1::a1= %d \n", a);
}
10a7f5d518f3454b92477a8d9db6c7d6.png

3. 使用 using 定义别名

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

int main()
{typedef const char* PCHAR;using PCHAR2 = const char*;PCHAR ptr1 = "hello world1";PCHAR2 ptr2 = "hello world2";
}

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

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 方式的,比如下面的代码。

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

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

namespace WKS
{namespace V1 {int a = 10;int b = 11;}
}int main()
{using namespace WKS::V1;printf("a=%d, b=%d", a, b);
}
37d0947aa0054140e9e36851f9acdc9a.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql模糊查询后分页_jsp模糊查询后的数据进行分页,但点击下一页后就查询全部的了...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort() path "/";%>信息表#container {width: 500px;}…

会议会展活动从业技能之会销流程的16个环节

会议营销是透过相对大型活动来实现销售。会议营销是细节营销,一般操作流程有会前、会中、会后三个阶段共计16个环节,每个环节都做到位了,衔接好了,会议营销的最终效果就会得到保证。一般而言,会议营销分为会前营销、会…

haproxy详细介绍

Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能:路由HTTP请求到后端服务器,基于cookie作会话绑定.能够将多个请求反代至后端主机完成负载均衡的效果.主服务器失败时能自动切换到备服务器上.接受特殊的端口连接完成服务监控拒绝新连接时不会关闭已经连接的请求…

SQL JOIN连接分类[转]

1、内联接&#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;&#xff1b;包括相等联接和自然联接&#xff1b; 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行&#xff1b; 2、外联接。外联接可以是左向外联接、右向…

《ASP.NET Core 6框架揭秘》实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient

在一个采用依赖注入框架的应用中&#xff0c;我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用&#xff0c;使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题&#xff0c;以及后者带来的好处&#xff0c;将通过如下这几个演示程序…

Hadoop部署方式-高可用集群部署(High Availability)

Hadoop部署方式-高可用集群部署(High Availability) 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 本篇博客的高可用集群是建立在完全分布式基础之上的&#xff0c;详情请参考&#xff1a;https://www.cnblogs.c…

sybase 连接mysql_如何连接到Sybase SQL Anywhere数据库

Sybase SQL Anywhere数据库具有许多非常有用的功能&#xff0c;与竞争对手相比&#xff0c;它具有很高的竞争力。首先&#xff0c;它允许您处理大量数据。其次&#xff0c;它具有很高的生产率&#xff0c;也就是说&#xff0c;可以快速提供大量数据。第三&#xff0c;它需要最少…

MaintainableCSS 《可维护性 CSS》 --- 模板篇

什么是模块(Modules) ? 模块是一个特别的独立单元&#xff0c;可以与其他模块组合以形成更复杂的结构。 在客厅里&#xff0c;我们可以认为电视&#xff0c;沙发和墙艺术是模块。它们聚在一起创造一个可用的房间。 如果我们把其中一个拿走&#xff0c;其他的能继续工作。我们不…

【汇编语言】DEBUG的使用

在masm for windows中&#xff0c;需要先生存exe文件&#xff0c;然后再点调试按钮。 常用的命令有&#xff1a; R命令&#xff1a;查看、改变CPU寄存器的内容&#xff1b;如果要修改某个寄存器的内容&#xff0c;可以在r的后面接上空格和寄存器名。如&#xff1a;-r ax&#x…

centos6.6 源码安装mysql5.5_CentOS6.x下源码安装MySQL5.5

2. 卸载原有的mysql数据库[rootzabbix ~]# yum -y remove mysql mysql-server mysql-libs compat-mysql51[rootzabbix ~]# rm -rf /var/lib/mysql[rootzabbix ~]# rm /etc/my.cnf[rootzabbix ~]# rpm -qa|grep mysql #如果还能查询出来mysql文件&#xff0c;继续删除&#xff0…

学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...

2018年5月21日&#xff0c;万恒教育成立IT运维就业指导部门&#xff0c;为韩立刚老师正式学生推荐工作&#xff0c;实习单位。和国内IT外包公司HR长期合作&#xff0c;韩立刚老师技术考核通过的学生&#xff0c;为学生在全国范围就近推荐工作。有学习IT运维课程&#xff0c;打算…

Leetcode 动态规划 Trapping Rain Water

本文为senlie原创。转载请保留此地址&#xff1a;http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Total Submissions: 50810My SubmissionsGiven n non-negative integers representing an elevation map where the width of each bar is 1, co…

白盒测试用例设计方法

一、白盒测试 根据软件产品的内部工作过程&#xff0c;在计算机上进行测试&#xff0c;以证实每种内部操作是否符合设计规格要求&#xff0c;所有内部成分是否已经过检查。这种测试方法就是白盒测试。白盒测试把测试对象看做一个打开的盒子&#xff0c;允许测试人员利用程序内部…

k8s 读书笔记 - 详解 Pod 调度(Ⅰ卷)

上一篇 《深入掌握 Pod》 文章我们介绍了 Pod 的知识点&#xff0c;接下来我们来继续学习 Pod 在 k8s 中的调度原理。在 k8s 平台上&#xff0c;通常情况下很少直接创建一个 Pod&#xff0c;大多情况下都是通过 Pod 的资源管理对象 来创建&#xff0c;例如&#xff1a;RC/RS、…

SaS中ne在mysql语句对应_SAS学习经验总结分享:篇四—SQL过程

SQL过程SQL过程是实现对数据集或关系数据库的表进行操作的过程&#xff0c;对数据集或关系数据库的表进行查询、修改、创建表、删除数据、插入数据和更新数据等功能。提现了SAS对大型数据库管理系统通用的SQL语言支持。SQL过程语法Proc sql ;数据操纵语句;quit;数据操纵语句&am…

.Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)

巴拉巴拉转载于:https://www.cnblogs.com/zltao/p/9074944.html

我对于全栈工程师的理解

对于才达到初级前端攻城狮的我来说&#xff0c;懵懵懂懂的我有了了解全栈工程师的机会&#xff0c;那什么是全栈工程师呢&#xff1f; 全栈工程师&#xff0c;也叫全端工程师(同时具备前端和后台能力)&#xff0c;英文Full Stack developer。是指掌握多种技能&#xff0c;并能利…

php数组操作集锦- 掌握了数组操作, 也就掌握了php

作为只是作为一种生存手段, 搞技术不用钻牛角尖! 有些东西, 只要大致了解, 如果已经进行了深入的了解, 但还是不能解决,就不要继续了... "专"相关的字, 只有 "钻" 金属旁的是zuan, 其余的都是 "zhuan" 包括: 转, 传, 专心.等等.. 其时, 要想掌握…

.NET MAUI实战 Navigation

1.概要用过WPF的小伙伴一般都用过Prism&#xff0c;Prism里面的导航概念在MAUI中也有类似的概念&#xff0c;在MAUI中是直接集成在框架中我们不需要安装任何其他的nuget包。直接使用Navigation对象即可,通常在移动平台中使用的更多&#xff0c;桌面程序中。我们先来看看微软官方…

mysql 修复表 阿里云_MySql数据表修复方法-阿里云开发者社区

mysqld进程在一个写入当中被杀死。计算机的意外关闭(例如&#xff0c;如果计算机掉电)。一个硬件错误这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多&#xff0c;你应该尝试找出其原因&#xff01;见G.1 调试一个MySQL服务器。在执行崩溃恢复时&#xf…