日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

深度探索C++ 对象模型(1)-三种对象模型的设计

發布時間:2025/3/21 c/c++ 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度探索C++ 对象模型(1)-三种对象模型的设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.類的成員

  • 數據成員
    . Static
    . Nonstatic
  • 成員函數
    . Static
    . Nonstatic
    . virtual

Questions:

C++封裝帶來的布局成本是多大?
由空類組成的繼承層次中,每個類對象的大小是多大?(答案見此篇)

2.虛函數表

  • 含有虛函數或其父類含有虛函數的類,編譯器都會為其添加一個虛函數表vptr
  • 每一個類為每一個virtual函數產生一個指針,放在表格中,這個表格就是虛函數表。每一個類對象會 被安插一個指針(vptr),指向該類的虛函數表。
  • vptr的設定和重置都由每一個類的構造函數、析構函數和復制賦值運算符自動完成。
  • 3.對象模型

    // An highlighted block var foo = 'bar';class Point { public: Point( float xval ); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print( ostream &os ) const;float _x; static int _point_count; };

    簡單對象模型
    表格驅動對象模型

    c++對象模型

    附注:
    RTTIRun Time Type Identification)運行時類型識別

    • 編譯器生成的特殊類型信息
    • 包括對象繼承關系,對象本身的描述
    • 為多態而生成的信息,所以只有具有虛函數的對象在會生成

    三種對象模型比較

    定義優點缺點
    簡單對象模型對象由一系列的指針組成,每一個指針都指向一個數據成員或成員函數,也即是說,每個數據成員和成員函數在類中所占的大小是相同的實現簡單空間;執行期的效率
    表格驅動對象模型一個指針指向數據成員表,一個指向函數表如果應用程序代碼未曾改變,但所用的class objects的nonstatic data members有所修改,那么那些應用程序是否需要重新編譯有一定彈性,因為提供了一層間接性空間;執行期的效率
    C++對象模型靜態數據成員,靜態成員函數和一般非靜態成員函數(包括構造函數)均存放在class object之外(單獨存取,和對象無關),而非靜態數據成員則被放在每一個class object內,虛函數則由虛表支持空間;執行期的效率如果應用程序代碼未曾改變,但所用的class objects的nonstatic data members有所修改,那么那些應用程序均得重新編譯

    [2] 是對類的頭文件改變時,需要重新編譯的說明:

    • add a data member

    This changes the size of instances of the class. Might be Ok for anyone who just uses pointers or references, if you take care to put that data behind all other data, so that the offsets for accessing the other data members do not change. But the exact layout of sub objects in binary is not defined, so you will have to rely on a specific implementation.

    【引用】
    [1]: <<深度探索C++ 對象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 譯
    [2] C++ — When recompilation is required https://stackoverflow.com/questions/4033487/c-when-recompilation-is-required

    總結

    以上是生活随笔為你收集整理的深度探索C++ 对象模型(1)-三种对象模型的设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。