亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c/c++ 奇技淫巧(一些c語言的技巧)

2020-01-26 14:13:39
字體:
來源:轉載
供稿:網友

一. 變長數組

嚴格說來,變長數組的實現在c++中并不是一件麻煩的事情。Stl中的vector本身就是一個變長數組,并且有自動管理內存的能力。
但是在c中,實現變長數組就稍顯麻煩。用C實現,必然需要一個結構,結構當中應當有一個指針,指針分配一段內存空間,空間大小根據需要而定,而且必須有另外一個字段記錄究竟開辟了多大多長的空間。
大致描述如下:

Struct MutableLenArray{  Int count;  Char* p;};

P = new Char[Count];

沒什么問題,但是C語言的使用者有個最大的自豪就在于對于效率、空間使用的掌控。他們會有這樣的疑問,如果count=0,那么p就沒必要了,白白占了4(64位系統為8)個字節的空間,簡直浪費。
那有沒有更好的方式能實現上面的需求,又保證空間合理呢?答案是有的,用0長度

Struct MutableLenArray { Int count; Char p[0]; }; 

和上面的結構使用方法一致,但是我們可以用sizeof嘗試讀取其大小,發現竟然只有count字段的長度4字節,p沒有被分配空間。完美!

二. 宏的妙用

1. #和

“#”符號把一個符號直接轉換為字符串,例如:

#define TO_STRING(x) #x const char *str = TO_STRING( test ); 

str的內容就是”test “,也就是說#會把其后的符號 直接加上雙引號。
這個特性為c++反射的實現提供了極大便利,可以參考博主的下一篇文章,c++反射的簡單實現。

##符號會連接兩個符號,從而產生新的符號(詞法層次),例如:

#define SIGN( x ) INT_##x   int SIGN( 1 ); 

宏被展開后將成為:int INT_1;
可以把##看成連字符,連字符為則為新符號的產生提供了方便。Google的Gtest框架就巧妙的運用了連字符來生成新的測試案例。

2. 變參宏

#define LOG( format, ... ) printf( format, __VA_ARGS__ )   LOG( "%s %d", str, count ); 

VA_ARGS是系統預定義宏,被自動替換為參數列表。
經常需要進行輸出格式化,重定義時,可以用到以上技巧。

3. 宏參數的prescan

prescan的定義:當一個宏參數被放進宏體時,這個宏參數會首先被全部展開(有例外,見下文)。當展開后的宏參數被放進宏體時, 預處理器對新展開的宏體進行第二次掃描,并繼續展開。例如:

#define PARAM( x ) x   #define ADDPARAM( x ) INT_##x   PARAM( ADDPARAM( 1 ) ); 

因為ADDPARAM( 1 ) 是作為PARAM的宏參數,所以先將ADDPARAM( 1 )展開為INT_1,然后再將INT_1放進PARAM。
例外情況是,如果PARAM宏里對宏參數使用了#或##,那么宏參數不會被展開:

#define PARAM( x ) #x   #define ADDPARAM( x ) INT_##x 

PARAM( ADDPARAM( 1 ) ); 將被展開為”ADDPARAM( 1 )”。

所以此時要得到“INT_1”的結果,必須加入一個中間宏:

#define PARAM(x) PARAM1(x)#define PARAM1( x ) #x 

PARAM( ADDPARAM( 1 ) );此時的結果將會是“INT_1”。根據prescan原則,當ADDPARAM(1)傳入,會展開得到INT_1,然后將INT_1帶入PARAM1宏,最終得到“INT_1”的結果。

4. 接口宏

以下部分,摘自網上博客,僅作聲明。
C++的目標之一就是把類的聲明和定義分離開來,這對于項目的開發極其有利――這可以使開發人員不用看到類的實現就能知曉類的功能。但是,C++實現類的聲明與類定義的分離的方法會導致一些額外的工作――每個非內聯函數的表示都需要寫兩次,一次在類聲明中,一次在類定義中。
代碼如下:

// .h File class Element { void Tick (); };// .cpp File void Element ::Tick () { // todo }

由于Tick的標識在兩個地方都出現了,因此如果我們需要改變這個方法的參數的時候(改變函數名、返回類型或者加const),我們需要改變兩個地方。
當然通常這沒有什么工作量,但是有些情況下這個特性會帶來不少麻煩。
舉個例子,如果我們有一個叫做BaseClass的基類,有三個從BaseClass繼承而來的子類――D1、D2和D3.其中BaseClass聲明了一個虛函數Foo()并且有一個缺省實現,并且D1、D2、D3中重載了Foo()函數。
現在,如果說我們給BaseClass::Foo()添加一個參數,但是忘了給D3中做相應的修改。麻煩來了――編譯可以通過,編譯器會把BaseClass::Foo(…)和D3::Foo()當成兩個完全不同的函數。當我們想通過虛函數機制來調用D3的Foo的時候,這就容易出一些問題。
UE4中光繼承自AActor類的類就有上千個,如果需要對AActor類做一個修改,那么如果使用傳統方法,我們還要針對上千個派生類進行修改,而且萬一有一個派生類沒有修改,編譯器也不會報錯!
這么看來,理想的情況是我們希望一個函數的表示只在一個地方存在,如果說只聲明BaseClass::Foo()一次,然后再它的派生類中不用再額外聲明Foo就好了。
而且在效率方面來說,在C++中使用繼承的時候我們經常會使用很多淺層次的類繼承關系,一個父類往往有一堆子類。很多時候我們只需要把很多互不相關的功能集成到一個單獨的類繼承家族里面。
對于淺繼承來說,我們只是把開始的父類聲明為一個接口――也就是說它聲明了一些虛函數(大部分是純虛函數)。在大多數情況下,我們會在這個類家族里面有一個基類以及其余的派生類。
如果說我們的基類有10個函數,我們從這個基類派生了20個類,那么我們就需要額外做200個函數聲明。但是這些聲明的目的往往只是為了Implement基類中的那些方法而已,這就或多或少的容易使得頭文件不好維護。
傳統方法的實現
如果說我們有一個Animal的類,這個類被視為基類,我們希望從這個基類派生出不同的子類。在Animal中有3個純需函數,如下所示:

class Animal { public: virtual std :: string GetName () const = 0 ; virtual Vector3f GetPosition () const = 0; virtual Vector3f GetVelocity () const = 0; }; 

同時,這個基類擁有三個派生類――Monkey,Tiger,Lion。
那么我們三個方法的每一個都會在7個地方存在:Animal中一次,Monkey、Lion、Tiget的聲明和定義各一次。
然后假設我們做一個小改動――我們想將GetPosition和GetVelocity的返回類型改為Vector4f以適應Transform變換,那么我們就要在7個地方進行修改:Animal的.h文件,Lion、Tiger和Monkey的.h文件和.cpp文件。
使用宏的實現
有一種很妙的處理方法就是將這些方法進行包裝,改成所謂接口宏的形式。我們可以試試看:

#define INTERFACE_ANIMAL(terminal)             /public:                           /  virtual std::string GetName() const ##terminal     /  virtual IntVector GetPosition() const ##terminal    /  virtual IntVector GetVelocity() const ##terminal    #define BASE_ANIMAL   INTERFACE_ANIMAL(=0;)#define DERIVED_ANIMAL INTERFACE_ANIMAL(;)

值得一提的是,##符號代表的是連接,/符號代表的是把下一行的連起來。
通過這些宏,我們就可以大大簡化Animal的聲明,還有所有從它派生的類的聲明了:

// Animal.hclass Animal{  BASE_ANIMAL ;};// Monkey.hclass Monkey : public Animal{  DERIVED_ANIMAL ;};// Lion.hclass Lion : public Animal{  DERIVED_ANIMAL ;};// Tiger.hclass Tiger : public Animal{  DERIVED_ANIMAL ;};

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩午夜激情| 国产精品 欧美在线| 九九久久综合网站| 欧美性生交xxxxxdddd| 国产精品第8页| 都市激情亚洲色图| 日韩亚洲国产中文字幕| 欧美激情在线播放| 亚洲精品国产精品乱码不99按摩| 欧美韩国理论所午夜片917电影| 欧美精品在线观看| 日韩乱码在线视频| 亚洲国产欧美一区二区丝袜黑人| 亚洲第一av在线| 98精品国产高清在线xxxx天堂| 亚洲影院在线看| 亚洲天堂男人天堂女人天堂| 国产精品极品美女粉嫩高清在线| 久久精品视频中文字幕| 中文字幕日韩电影| 欧美一级大胆视频| 欧美日韩性视频在线| 亚洲va欧美va国产综合久久| 在线播放精品一区二区三区| 久久99视频免费| 亚洲欧洲中文天堂| 欧美性猛交xxxx乱大交极品| 国产精品久久久久一区二区| 中文字幕日本欧美| 欧美激情精品久久久| 一区二区三区回区在观看免费视频| 欧美性猛交xxxx黑人| 国产精品永久免费视频| 欧美黄色片在线观看| 全球成人中文在线| 国产精品视频导航| 一区二区三欧美| 久久亚洲影音av资源网| 日韩专区中文字幕| 国产精品久久不能| 国产区精品在线观看| 色偷偷偷亚洲综合网另类| 国产精品大片wwwwww| 国产97色在线| 91精品国产自产在线观看永久| 91精品国产91久久久久久最新| 色播久久人人爽人人爽人人片视av| 不卡av电影院| 国产精品稀缺呦系列在线| 国产精品一区二区久久国产| 91精品国产综合久久香蕉的用户体验| 久久久久国产精品免费| 国产人妖伪娘一区91| 久久精品亚洲精品| 日韩国产精品一区| 欧美做爰性生交视频| 久久久久久久亚洲精品| 成人日韩av在线| 色www亚洲国产张柏芝| 亚洲香蕉伊综合在人在线视看| 亚洲成人黄色在线观看| 亚洲第一天堂无码专区| 色妞一区二区三区| 久久噜噜噜精品国产亚洲综合| 亚洲精品美女久久久久| 欧美午夜宅男影院在线观看| 成人在线国产精品| 精品久久久久久久久久| 欧美日韩一区二区三区在线免费观看| 亚洲精品456在线播放狼人| 久久99久久99精品中文字幕| 久久精品成人一区二区三区| 亚洲免费影视第一页| 久精品免费视频| 精品欧美一区二区三区| 91亚洲一区精品| 久久久久久中文字幕| 欧美激情视频网站| 精品久久久久人成| 日韩女优人人人人射在线视频| 亚洲国产精品电影在线观看| 亚洲欧美日韩久久久久久| 午夜精品一区二区三区视频免费看| 久久理论片午夜琪琪电影网| 亚洲精品网站在线播放gif| 日本欧美爱爱爱| 日韩免费视频在线观看| 国产视频在线一区二区| 亚洲一区二区三| 北条麻妃一区二区在线观看| 国产主播喷水一区二区| 色噜噜狠狠色综合网图区| 亚洲精品国偷自产在线99热| 国产在线拍揄自揄视频不卡99| 98精品国产高清在线xxxx天堂| 国产精品久久久久7777婷婷| 亚洲白拍色综合图区| 中文字幕自拍vr一区二区三区| 国产精品偷伦一区二区| 久久精品国产久精国产思思| 中文字幕av一区中文字幕天堂| 国产一区二区久久精品| 亚洲第一精品夜夜躁人人躁| 在线色欧美三级视频| 狠狠操狠狠色综合网| 亚洲石原莉奈一区二区在线观看| 午夜剧场成人观在线视频免费观看| 美女av一区二区| 成人av在线网址| 91免费看视频.| 性色av一区二区三区免费| 97精品伊人久久久大香线蕉| 国产精品自产拍高潮在线观看| 免费91在线视频| 在线播放国产一区二区三区| 国语自产精品视频在线看抢先版图片| 国内精品小视频| 久久精品国产精品| 国产精品黄色av| 久久视频在线视频| 亚洲精品自在久久| 一区二区日韩精品| 日韩av在线高清| 日韩大胆人体377p| 91国产美女在线观看| 欧美中文字幕在线播放| 亚洲成色777777女色窝| 国产91精品高潮白浆喷水| 国产精自产拍久久久久久蜜| 欧美性在线观看| 精品女同一区二区三区在线播放| 日韩在线观看免费全| 在线视频一区二区| 国产美女久久精品香蕉69| 亚洲国产黄色片| 国产97色在线|日韩| 久久久久久久影视| 国产日韩中文在线| 黑人巨大精品欧美一区二区一视频| 久久影视三级福利片| 亚洲精品大尺度| 日韩成人在线播放| 国产精品综合网站| 在线观看日韩av| 亚洲激情自拍图| 久久精品成人动漫| 日韩一级黄色av| 777午夜精品福利在线观看| 亚洲999一在线观看www| 亚洲精品免费网站| 久久成人一区二区| 欧美精品在线播放| 欧美日韩电影在线观看| 69视频在线播放| 日本免费久久高清视频| 91精品久久久久久久久中文字幕| 91国语精品自产拍在线观看性色| www欧美xxxx| 大量国产精品视频| 亚洲va久久久噜噜噜| 成人网在线视频| 国产精品久久久久久亚洲影视| 国产精品香蕉国产| 欧美极品少妇xxxxx|