Time of Update: 2018-12-04
普通成員函數的調用 從這部分開始我們除了利用記憶體的資訊列印來進行探索外,更多的會通過跟蹤和觀察編譯器產生的彙編代碼來理解編譯器對這些語言特性的實現方式。彙編方面知識的討論超出了本文的範圍,我只對和我們討論相關的彙編代碼進行解析。理解本文要討論的知識並不需要有很完整的彙編知識,但必須瞭解起碼的概念。 下面我們看看引入虛繼承後的影響。為了有所對比我們首先看看普通成員函數的調用情況。 執行如下代碼,它包括了對象的普通成員函數調用,類的靜態成員函數調用、通過指標調用普通成員函數:C010
Time of Update: 2018-12-04
菱形結構的虛繼承 這次我們看看菱形結構的虛繼承。虛繼承的引入本就是為瞭解決複雜結構的繼承體系問題。上一篇我們在討論虛繼承時用的是一個簡單的繼承結構,只是為了打個鋪墊。 我們先看看這幾個類,這是一個典型的菱形繼承結構。C100和C101通過虛繼承共用同一個父類C041。C110則從C100和C101多重繼承而來。struct C041{C041() : c_(0x01) {}virtual void foo() { c_ = 0x02; }char c_;};struct C100 :
Time of Update: 2018-12-04
看《編程之美》第二節的時候,它是定義的一個整型,然後取位。但是他的那個或運算子號好像寫錯了,寫成了異或符號“^”,應該是“|”。我就突然對二進位的輸出感興趣了。想知道怎樣輸出二進位。我們知道C++輸出十六進位是cout〈〈hex〈〈 a;而八進位是cout〈〈 ocx〈〈 a;二進位則沒有預設的輸出格式,需要自己寫函數進行轉換,於是上網搜尋了一下。網上思路真是廣泛啊。下面列出一些方法。 #include 〈iostream〉 #include 〈list〉
Time of Update: 2018-12-04
生存期和範圍,究竟有什麼樣的關係呢?先解釋一下生存期吧。一個進程對應的記憶體空間中,包含5種不同的資料區。按照記憶體中從低到高的順序,分別為:棧、堆、BSS段、資料區段和程式碼片段。棧:存放程式臨時建立的局部對象。一般VC++6.0產生的可執行檔只有1MiB多的棧。堆:存放進程運行中被動態分配的記憶體段。它大小並不固定,可動態擴張或縮減。屬於記憶體中最多的資源。BSS段:(它是block started by
Time of Update: 2018-12-04
原書這部分內容很多,至少相對於迴圈鏈表是很多。相信當你把單鏈表的指標域搞清楚後,這部分應該難不倒你。現在我的問題是,能不能從單鏈表派生出雙向鏈表?你可以有幾種做法:一種就是先定義一個雙鏈節點——但是,它的名字必須叫Node,這是沒辦法的事;不然你就只好拷貝一份單鏈表的實現檔案,把其中的Node全都替換成你的雙鏈節點名字,但是這就不叫繼承了。另一種做法就是先定義一種結構例如這樣的:template <class Type> class newtype{public:Type data;
Time of Update: 2018-12-04
C‧符號列表數學符號:符號說明範例+加號或正值a = 1 + 2;//結果 a = 3a = -5; b = +a;//結果 b = 5 -減號或負值a = 3 - 1;//結果 a = 2a = 5; b = -a;//結果 b = -5; *乘號a = 2 * 3;//結果 a = 6/除號a = 6 / 2;//結果 a = 3%餘數a = 7 % 2;//結果 a =
Time of Update: 2018-12-04
先看一例子: class base { public: virtual void f() const {}; }; class d1 : virtual public base {}; class d2 : virtual public base {}; class derived : public d1,
Time of Update: 2018-12-04
T. W. Burger (twburger@bigfoot.com), 老闆, Thomas Wolfgang Burger Consulting 公司2000 年 9 月 01 日您是否做過這樣一個項目,它要求您在記憶體中儲存數目不定的若干不同對象?對於某些情況,二叉樹是最佳選擇,但在通常情況下,更簡單的鏈表是顯而易見的選擇。一個簡化的問題樣本鏈表的痛點在於必須複製鏈表處理函數來處理不同的對象,即便邏輯是完全相同的。例如:兩個結構類似的鏈表struct Struct_Object_A{
Time of Update: 2018-12-04
1. 僅有一個虛函數的類 class C010{ virtual void foo(){};}; // sizeof = 4 輸出結果為:The size of C010 is 4The detail of C010 is 50 d0 46 00 當一個類中有虛函數時,編譯器會為該類產生一個虛函數表,並在它的每一個對象中插入一個指向該虛函數表的指標,通常這個指標是插在對象的起始位置。所謂的虛函數表實際就是一個指標數組,其中的指標指向真正的函數起始地址。在本次的測試輸出中,
Time of Update: 2018-12-04
前言 本文通過觀察對象的記憶體布局,跟蹤函數調用的彙編代碼。分析了C++對象記憶體的布局情況,虛函數的執行方式,以及虛繼承,等等。 寫這篇文章源於我在論壇上看到的一個貼子。有人問VC使用了哪種方式來實現虛繼承。當時我寫了一點代碼想驗證一下,結果發現情況比我想象的要複雜。所以我就乾脆認真把相關的問題都過了一遍,並記錄成本文。 我對於C++物件模型的知識主要來自於Lippman的書《Inside the C++ Object
Time of Update: 2018-12-04
本文檔節選並整理自潘凱的《C++物件版面配置及多態實現的探索》系列。原文請參見 http://lunatic.bokee.com/1. 空類: class C000{}; // sizeof = 1它的大小為1位元組,這是一個預留位置,我們可以看到它的值是0xcc。在debug模式下,這表示是由編譯器插入的調試代碼所初始化的記憶體。在release模式下可能是個隨機值。這個位元組保證C000類的執行個體對象擁有不同的記憶體位址。&a!=&b。2.
Time of Update: 2018-12-04
***數組和指標是如何訪問的***標準規定賦值符必須用可修改的左值(為了與數組名區分,數組名也用於確定對象在記憶體中的位置,也是左值,但它不能作為賦值的對象)作為它左側的運算元,而其右側的運算元是地址的內容(右值)。數組和指標的差別:(1)數組只需將起始地址加上位移地址,再解除引用既可取得數組中的各個元素;而指標需先將自身解除引用以擷取所指向對象的地址,再解除引用才可取得所指向對象的內容;(a)對數組下標的引用:char a[9] = "abcdefgh";char c;c = a[i];//
Time of Update: 2018-12-04
之前搞過這個中英文與UNICODE十六進位字串的互轉,但是發現有點小問題。現在重新搞了一個,測試中暫時沒有發現什麼問題。先記錄下來。我嘗試使用過MultiByteToWideChar和WideCharToMultiByte來實現這個功能,但是發現不行。也就是無法實現如:中文English --> 4e2d65870045006e0067006c006900730068和4e2d65870045006e0067006c006900730068 --> 中文English這麼一個轉換,
Time of Update: 2018-12-04
作者:watercloud 首頁:http://www.nsfocus.com 日期:2002-4-15 目錄: 1. C++中虛函數的靜態聯編和動態聯編 2. VC中對象的空間組織和溢出實驗 3. GCC中對象的空間組織和溢出實驗 4. 參考<一> C++中虛函數的靜態聯編和動態聯編 C++中的一大法寶就是虛函數,簡單來說就是加virtual關鍵字定義的函數。 其特性就是支援動態聯編。現在C++開發的大型軟體中幾乎已經離不開虛函數的
Time of Update: 2018-12-04
loadbmp.h#include <stdio.h>#include <math.h>#include <time.h>#include <string.h>#include <stdlib.h>#define pi (double)3.14159265359#define BI_RGB 0#define BI_RLE8 1#define BI_RLE4 2#define BI_BITFIELDS 3typedef unsigned
Time of Update: 2018-12-04
編寫好驅動之後,另外寫了個C程式來測試驅動,但是在編譯的時候,出現了如下的錯誤:build/core/base_rules.mk:166: *** frameworks/base/opengl/libs: MODULE.TARGET.ETC.egl.cfg already defined by development/tools/emulator/opengl/system/egl。
Time of Update: 2018-12-04
1.pair在通用工具標頭檔中。#include <utility>pair可以將兩個值視為一個單元,C++ STL中多處使用了這個類。尤其容器類map,multimap,就是使用pairs來管理其鍵/值(key/value)的成對元素。任何函數想返回2個的值都可以使用pair。比如:#include <iostream>#include <utility>// pair 一對 資料 可用於 函數返回2個 資料using namespace
Time of Update: 2018-12-04
進程簡單的說就是把一段代碼複製成多份,並讓他們同時執行。處理序間通訊是為了讓他們有序的運行線程簡單的說就是讓多個函數同時執行,線程間通訊是為了讓他們有序的運行編譯線程程式時會警告說線程函數找不到 pthread 庫不是 Linux 系統預設的庫,串連時需要使用靜態庫 libpthread.a,所以在使用pthread_create()建立線程,以及調用 pthread_atfork()函數建立fork處理常式時,需要連結該庫。問題解決: 在編譯中要加 -lpthread參數 gcc
Time of Update: 2018-12-04
////////////////////////////////////////////////////////////////////以下是本人寫的關於求任意位二進位碼海明編碼的程式(C++環境運行)///////////////////////////////////////////////////////////////////#include <iostream>#include <fstream>#include <stdio.h>#define
Time of Update: 2018-12-04
C++ Template 的相關書籍 聊聊C++ Template的一些好書吧! 關於template一本很全面的介紹C++ Template的書在china-pub上可以找得到:http://www.china-pub.com/computers/common/info.asp?id=17709,也有中文翻譯版本(哈哈,剛才看了一下,英文版缺貨,中文版絕版,幸虧偶買的早)。 如果再配合看這本:《Modern C++ Design: Generic