1. 程式人生 > >C++面試基礎知識複習系列——二

C++面試基礎知識複習系列——二

1、類的物件在記憶體中所佔空間的分析;

1>空類,佔用一個位元組。原因,為了區分不同類的例項。

2>在沒有虛擬函式的類的物件中,類的物件所佔空間的大小分析方式與struct型別所佔空間的大小相同,只需要計算非靜態資料成員。因為成員函式的函式地址被儲存在的程式碼段,而資料成員儲存在資料段。

3>靜態成員變數不佔用類的物件的儲存空間。

4>當類中存在虛擬函式的時候,在例項化物件的時候,編譯器會自動在物件裡安插一個指標指向vPtr指向虛擬函式表vTable。

5>考慮記憶體對齊的問題。

2、智慧指標。unique_ptr/shared_ptr/weak_ptr/auto_ptr(C++11已經棄用)。

智慧指標和普通指標相比實際上是對普通指標加了一層封裝機制,這樣的一個封裝機制的目的在於使得智慧指標可以方便的管理一個物件的生命期。一個物件在什麼時候析構或者是什麼條件下析構是受智慧指標本省決定的,不需要使用者的管理;

1>scoped_ptr。

scoped_ptr在其作用域之外會被析構,它是non-copyable的,為了防止多次析構同一個指標所指向的物件。

2>shared_ptr。其實現的本質是引用計數,也就是說shared_ptr是支援複製的,複製一個shared_ptr的本質是對這個智慧指標的引用次數加1,而當這個智慧指標的引用次數降至0的時候,該物件自動被析構。假設shared_ptr所表徵的引用關係中出現了一個環,那麼環上所述物件的引用次數不可能減為0,也就不會被刪除,為了解決這個問題引入了weak_ptr。

3>weak_ptr。它與shared_ptr最大的區別在於weak_ptr在指向一個物件的時候不會增加其引用計數,因此你可以在一個weak_ptr在指向一個物件的時候去析構它。當再次訪問weak_ptr的時候,會返回空的shared_ptr。

實際上,通常shared_ptr內部實現的時候維護的就不是一個引用計數,而是兩個引用計數,一個表示strong reference,也就是用shared_ptr進行復制的時候進行的計數,一個是weak reference,也就是用weak_ptr進行復制的時候的計數。weak_ptr本身並不會增加strong reference的值,而strong reference降低到0,物件被自動析構。為什麼要採取weak_ptr來解決剛才所述的環狀引用的問題呢?需要注意的是環狀引用的本質矛盾是不能通過任何程式設計語言的方式來打破的,為了解決環狀引用,第一步首先得打破環,也就是得告訴C++,這個環上哪一個引用是最弱的,是可以被打破的,因此在一個環上只要把原來的某一個shared_ptr改成weak_ptr,實質上這個環就可以被打破了,原有的環狀引用帶來的無法析構的問題也就隨之得到了解決。

3、四種強制型別轉換。

相關推薦

C++面試基礎知識複習系列——

1、類的物件在記憶體中所佔空間的分析; 1>空類,佔用一個位元組。原因,為了區分不同類的例項。 2>在沒有虛擬函式的類的物件中,類的物件所佔空間的大小分析方式與struct型別所佔空間的大小相同,只需要計算非靜態資料成員。因為成員函式的函式地址被儲存在的程

C++面試基礎知識複習系列——一

1、const關鍵字的作用。 1>修飾變數,說明該變數不可修改; 2>修飾指標,分為常量指標與指標常量。 example1: int* const p=&a;指標常量,*p=8,ok;p=&b,錯誤; example2: const i

C++面試基礎知識複習系列——四

1、查詢; 查詢演算法 平均時間複雜度 空間複雜度 查詢條件 順序查詢 O(n) O(1) 無 二分查詢 O(log2n) O(1) 有序 雜湊查詢 O(1) O(n) 無 二叉查詢樹

java面試基礎知識總結(

五、Object 通用方法 equals()方法 等價關係 Ⅰ 自反性 x.equals(x); // true Ⅱ 對稱性 x.equals(y) == y.equals(x); // true Ⅲ 傳遞性 if (x.equals(y)

Java基礎知識複習)--流程控制

1.練習-黃金分割點 尋找某兩個數相除,其結果 離黃金分割點 0.618最近 分母和分子不能同時為偶數 分母和分子 取值範圍在[1-20] package review2; public class Test1 { public static void main(S

【夾娃系列】java面試基礎知識儲備(¥1)——java的優點和C++的異同點

怎麼才能夾到布娃娃 沒錯!!這個文章就是告訴你怎麼才能用一個硬幣,抓到最多的布娃娃QAQ,這是我抓娃娃的第一個硬幣¥1.【宣告】夾娃系列純屬個人學習,參考了不少面試的書,《程式設計之美》、《演算法珠璣》、《劍指offer》、《java程式設計師

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常的原因和解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

C#入門基礎知識

C#的常量和變數 1. C#的常量 常量,顧名思義,就是“不會改變的量”,我們平時書寫的數字、字元和字串,他們都屬於“字面常量”,編寫程式碼時我們常常會使用自定義變數。 請閱讀下面程式碼: namespace Test { Class Program {

Java基礎知識複習(四)-- 對維陣列排序+求質數的個數

1.練習-二維陣列排序 首先定義一個5X8的二維陣列,然後使用隨機數填充滿。 藉助Arrays的方法對二維陣列進行排序。 參考思路: 先把二維陣列使用System.arraycopy進行陣列複製到一個一維陣列 然後使用sort進行排序 最後再複製回到二維陣列。 pack

Java基礎知識複習(十)-- 叉樹排序

二叉樹 二叉樹由各種節點組成 二叉樹特點: 每個節點都可以有左子節點,右子節點 每一個節點都有一個值 二叉樹排序 假設通過二叉樹對如下10個隨機數進行排序 67,7,30,73,10,0,78,81,10,74 排序的第一個步驟是把資料插入到該二叉樹中,

C++基礎知識複習--運算子過載(非成員函式過載和成員函式過載)

#include<iostream> using namespace std; class Complex { private: float Vector_x; float Vector

面試基礎知識整理 —— 叉搜尋樹

1. 定義 二叉查詢樹(英語:Binary Search Tree),也稱二叉搜尋樹、有序二叉樹(英語:ordered binary tree),排序二叉樹(英語:sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:

C++基礎知識複習--結構體類陣列作為函式引數

//結構體陣列,類陣列,普通陣列,作為函式引數 #include<iostream> #include<string> using namespace std; class C

C語言基礎知識整理

除法 當前 www 做到 初步 編寫 main函數 配對 十進制數 用一個簡單的c程序例子,介紹C語言基礎知識的基本構成、格式、以及良好的書寫風格,使小夥伴對c語言有個初步認識。 例1:計算兩個整數之和的c程序: #includemain(){int a,b,sum;

工作中能用到的基礎知識總結(

protected 構造函數 blog 繼承鏈 附加 調用 初始化 傳統 -s 簡介 繼承、封裝和多態是面向對象編程的重要特性。要想運用好,就必須熟悉這三種特性,本篇說說我對封裝、繼承和多態相關的知識總結。 知識點 一、訪問修飾符 C#中類及

C語言基礎知識

sig 指向 開始 extern strong font 寬度 main bsp printf函數向終端輸出若幹個任意類型的數據。 表示輸出類型的格式字符     格式字符意義 a 浮點數、十六進制數字和p-計數法(C99) A

C++ 面試基礎

bug logs ase 臨時變量 define 靜態變量 析構函數 http another 1.Static Staic特點:只初始化一次,存在靜態區,區別於Auto 變量,存在於棧中(函數結束,也就銷毀)。 類內的staic:靜態數據成員必須在類外初始化,靜態成員函

django基礎知識筆記(

log 技術分享 過濾 搜索 筆記 基礎 技術 http alt 一,深度搜索 二,過濾器fiter django基礎知識筆記(二)

c++ 部分基礎知識 ---- (1)

知識 gin href com cin http targe 基礎知識 ucs 灰dtj4慚fv腺伎孕6xnhttp://www.docin.com/app/user/userinfo?userid=179253887 傅zpf攣詿4隊餵皇影http://www.doci

基礎知識《十》一篇文章理解Cookie和Session

alt str web應用 rfi 密鑰 hide 開始 單位 ews 理解Cookie和Session機制 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Co