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