網(wǎng)站首頁 編程語言 正文
一:背景
相信大家在分析 dump 時(shí),經(jīng)常會(huì)看到?WKS
?和?SRV
?這樣的字眼,如下代碼所示:
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
其實(shí)這就是命名空間,即 coreclr 在編譯源碼的時(shí)候,為?WKS
?和?SVR
?各編譯了一份,不知道這么做的初衷是什么,這里就不管了,接下來看下 coreclr 中大概長(zhǎng)啥樣子。
namespace WKS { #include "gcimpl.h" #include "gc.cpp" } namespace SVR { #include "gcimpl.h" #include "gc.cpp" }
二:聊一聊 namespace
其實(shí)和 C# 的 namespace 本質(zhì)差不多,都是起到隔離的作用,而且和 using 的配合使用和 C# 也是如出一轍,太有意思了。
1. 簡(jiǎn)單的隔離
在 C++ 中默認(rèn)只有一個(gè) namespace,所以相同的變量會(huì)出現(xiàn)沖突,解決辦法就是用 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); }
當(dāng)然還可以嵌套使用,比如改成這樣。
namespace WKS { namespace V1 { int a = 10; int b = 11; } } int main() { printf("WKS::a= %d \n", WKS::V1::a); }
接下來看下匯編代碼:
哈哈,看到上面的?WKS::V1::a
?感覺是不是挺舒服的,也特能理解目前的?coreclr!WKS::xxx
?了, 不過這里有一個(gè)麻煩的地方,就是每次用?a
?的時(shí)候都要輸入很長(zhǎng)的前綴,那有沒有簡(jiǎn)化的方法呢? 當(dāng)然有啦。
2. 使用 using 導(dǎo)入
接下來我們用 using 直接在 main 函數(shù)中定義字段,后續(xù)就不需要再寫長(zhǎng)長(zhǎng)的前綴引用了,參考代碼如下:
namespace WKS { namespace V1 { int a = 10; int b = 11; } } int main() { using WKS::V1::a; printf("WKS::V1::a1= %d \n", a); }
3. 使用 using 定義別名
定義別名這功能特別好,個(gè)人感覺已經(jīng)完全替代以前的?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 導(dǎo)入
這個(gè)是最普遍的,我們對(duì)系統(tǒng)庫(kù)的調(diào)用,無一不是用 using namespace 方式的,比如下面的代碼。
using namespace std; int main() { string str = "hello world"; }
接下來我們把 V1 導(dǎo)入到 main 方法中,這樣就可以自由自在的使用?WKS::V1
?中的內(nèi)容了,參考如下代碼:
namespace WKS { namespace V1 { int a = 10; int b = 11; } } int main() { using namespace WKS::V1; printf("a=%d, b=%d", a, b); }
好了,這就是對(duì) namespace 的一點(diǎn)理解,本篇就說這么多吧,希望對(duì)你有幫助。
原文鏈接:https://www.cnblogs.com/huangxincheng/p/16646061.html
相關(guān)推薦
- 2022-07-09 Dockerfile文件介紹
- 2022-05-17 ubuntu切換python版本解決語法不匹配問題(SyntaxError: invalid syn
- 2022-09-15 Python利用shutil實(shí)現(xiàn)拷貝文件功能_python
- 2022-04-08 Android實(shí)現(xiàn)一個(gè)簡(jiǎn)單的單詞本_Android
- 2022-04-12 C++制作簡(jiǎn)單的計(jì)算器功能_C 語言
- 2022-08-17 R語言ggplot2拼圖包patchwork安裝使用_R語言
- 2022-10-04 golang中time包之時(shí)間間隔格式化和秒、毫秒、納秒等時(shí)間戳格式輸出的方法實(shí)例_Golang
- 2023-04-23 Go之接口型函數(shù)用法_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支