日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型

發(fā)布時(shí)間:2025/3/21 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

  • 數(shù)據(jù)類型:
    • 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è)鍵值對。

  • List命令
  • 按插入順序排序,一個(gè)List最多存儲232?12^{32}-1232?1個(gè)元素。

  • Set命令
  • String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。

    Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。

    集合中最大的成員數(shù)為 232?12^{32} - 1232?1(4294967295, 每個(gè)集合可存儲40多億個(gè)成員)。

  • Sorted Set命令
  • 有序集合和集合一樣也是 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

  • ASIO 與c++標(biāo)準(zhǔn)庫:
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。