c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
c++服務(wù)器開發(fā)學(xué)習(xí)--02--MySQL,Redis,ASIO,iocp,TrinityCore代碼結(jié)構(gòu),c++對象模型
- MySQL
- 問題
- Redis
- Asio
- iocp
- TrinityCore代碼結(jié)構(gòu)
- c++對象模型
- 虛函數(shù)表(vtbl)、虛指針(vptr)
- 對象模型
- 非繼承
- 單繼承
- 多繼承
- 虛繼承
MySQL
學(xué)習(xí)鏈接:MySQL教程|菜鳥教程,博主學(xué)的是基礎(chǔ)部分。
數(shù)據(jù)庫操作:創(chuàng)建(CREATE),刪除(DROP)
數(shù)據(jù)表操作:
-
創(chuàng)建:CREATE
-
刪除:DROP
-
插入:INSERT INTO
-
查詢:SELECT FROM…… WHERE……
-
更新:UPDATE……SET……
-
刪除數(shù)據(jù)表中的某些數(shù)據(jù):DELETE FROM
-
獲取指定記錄:LIKE
-
排序:ORDER BY (ASC:升序;DESC:降序)
-
分組:GROUP BY
-
連接SELECT語句結(jié)果:UNION,UNION ALL(取重復(fù)值)
-
多張數(shù)據(jù)表中取數(shù)據(jù):
問題
UNION 和 INNER JOIN在用處上有什么區(qū)別?
Redis
學(xué)習(xí)鏈接:Redis教程|菜鳥教程,博主學(xué)的是基礎(chǔ)部分。
Redis:Remote Dictionary Server
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
- 命令:redis-cli,
連接到本地的redis服務(wù);
連接到某個(gè)特定的redis服務(wù);
- 鍵命令的基本語法:
String命令
Hash命令
是一個(gè)string類型的field(字段)和value的(值)映射表,存儲鍵值對;一個(gè)hash最多存儲232?12^{32}-1232?1個(gè)鍵值對。
按插入順序排序,一個(gè)List最多存儲232?12^{32}-1232?1個(gè)元素。
String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。
集合中最大的成員數(shù)為 232?12^{32} - 1232?1(4294967295, 每個(gè)集合可存儲40多億個(gè)成員)。
有序集合和集合一樣也是 string 類型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè) double 類型的分?jǐn)?shù)。redis 正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。 集合中最大的成員數(shù)為 232?12^{32} - 1232?1 (4294967295, 每個(gè)集合可存儲40多億個(gè)成員)。
Asio
學(xué)習(xí)鏈接:c++網(wǎng)絡(luò)編程之a(chǎn)sio
c++20標(biāo)準(zhǔn)庫的網(wǎng)絡(luò)部分主要基于ASIO,ASIO主要只有socket和socket編程需要的定時(shí)器功能會進(jìn)標(biāo)準(zhǔn)(標(biāo)準(zhǔn)也是循序漸進(jìn),第一個(gè)版本就只有這點(diǎn),http之類的,可能會在后續(xù)版本加入),ASIO本身包含的文件、串口、unix域套接字等都會刪掉。進(jìn)入C++20的功能大概只占ASIO的25%。
iocp
學(xué)習(xí)鏈接:完成端口教程
TrinityCore代碼結(jié)構(gòu)
https://github.com/TrinityCore/TrinityCore
c++對象模型
學(xué)習(xí)鏈接:圖說C++對象模型
對象模型研究的是對象在存儲上的空間與時(shí)間上的更優(yōu),并對C++面向?qū)ο蠹夹g(shù)加以支持,如以虛指針、虛表機(jī)制支持多態(tài)特性。
虛函數(shù)表(vtbl)、虛指針(vptr)
-
虛函數(shù)表:當(dāng)一個(gè)類在實(shí)現(xiàn)的時(shí)候,如果存在一個(gè)或以上的虛函數(shù)時(shí),那么這個(gè)類便會包含一張?zhí)摵瘮?shù)表。而當(dāng)一個(gè)子類繼承并重載了基類的虛函數(shù)時(shí),它也會有自己的一張?zhí)摵瘮?shù)表。
-
虛函數(shù)調(diào)用與虛指針:
對于虛函數(shù)的調(diào)用是通過查虛函數(shù)表來進(jìn)行的,每個(gè)虛函數(shù)在虛函數(shù)表中都存放著自己的一個(gè)地址,而如何在虛函數(shù)表中進(jìn)行查找,則是通過虛指針來調(diào)用,在內(nèi)存結(jié)構(gòu)中它一般都會放在類最開始的地方。
虛表指針(vptr)的位置為編譯器決定,傳統(tǒng)上它被放在所有顯示聲明的成員之后,不過現(xiàn)在許多編譯器把vptr放在一個(gè)類對象的最前端。
- 虛函數(shù)與普通函數(shù)的調(diào)用關(guān)系:
只要某一個(gè)類X包含虛函數(shù),無論是它的父類或者它本身擁有,那么這個(gè)類的對象都會包含一個(gè)虛指針vptr,至于vptr要指向哪張表,取決于類X它本身是否含有虛函數(shù)。
對象模型
非繼承
構(gòu)造函數(shù)-析構(gòu)函數(shù)-虛函數(shù)-nonstatic數(shù)據(jù)成員-static數(shù)據(jù)成員
通過 (int*)(&p)取得虛函數(shù)表的地址;
type_info信息的確存在于虛表的前一個(gè)位置。通過((int)(int*)(&p) - 1))取得type_infn信息,并成功獲得類的名稱的Base;
虛函數(shù)表的第一個(gè)函數(shù)是析構(gòu)函數(shù);
虛函數(shù)表的第二個(gè)函數(shù)是虛函數(shù)print(),取得地址后通過地址調(diào)用它(而非通過對象),驗(yàn)證正確;
虛表指針的下一個(gè)位置為nonstatic數(shù)據(jù)成員baseI;
可以看到,static成員函數(shù)的地址段位與虛表指針、baseI的地址段位不同。
單繼承
-
在C++對象模型中,對于一般繼承(這個(gè)一般是相對于虛擬繼承而言),若子類重寫(overwrite)了父類的虛函數(shù),則子類虛函數(shù)將覆蓋虛表中對應(yīng)的父類虛函數(shù)(注意子類與父類擁有各自的一個(gè)虛函數(shù)表);若子類并無overwrite父類虛函數(shù),而是聲明了自己新的虛函數(shù),則該虛函數(shù)地址將擴(kuò)充到虛函數(shù)表最后。
-
而對于虛繼承,若子類overwrite父類虛函數(shù),同樣地將覆蓋父類子物體中的虛函數(shù)表對應(yīng)位置,而若子類聲明了自己新的虛函數(shù),則編譯器將為子類增加一個(gè)新的虛表指針vptr。
多繼承
-
多個(gè)父類一個(gè)子類
- 在多繼承中,子類含有多個(gè)父類的子對象,子類的虛函數(shù)被放在聲明的第一個(gè)基類的虛函數(shù)表中。
- 當(dāng)子類overwrite了父類的函數(shù),所有基類的print()函數(shù)都被子類的print()函數(shù)覆蓋。
- 內(nèi)存布局中,父類按照其聲明順序排列。
-
一個(gè)父類被重復(fù)繼承 (菱形繼承)
虛繼承
虛繼承的子類,如果本身定義了新的虛函數(shù),**則編譯器為其生成一個(gè)虛函數(shù)指針(vptr)以及一張?zhí)摵瘮?shù)表。**該vptr位于對象內(nèi)存最前面。
vs非虛繼承:直接擴(kuò)展父類虛函數(shù)表。
虛繼承的子類也單獨(dú)保留了父類的vptr與虛函數(shù)表。這部分內(nèi)容接與子類內(nèi)容以一個(gè)四字節(jié)的0來分界。
虛繼承的子類對象中,含有四字節(jié)的虛表指針偏移值。
總結(jié)
以上是生活随笔為你收集整理的c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++服务器开发学习--01--c++基
- 下一篇: 区块链BaaS云服务(9)索尼 区块链通