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

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

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

2020-05-23 13:48:24
字體:
來源:轉載
供稿:網友

一. 變長數組

嚴格說來,變長數組的實現在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
欧美性xxxx极品hd满灌| 91九色国产社区在线观看| 日韩精品免费在线播放| 国产午夜精品视频免费不卡69堂| xxx成人少妇69| 亚洲成av人影院在线观看| 国产精品香蕉在线观看| 国产精品草莓在线免费观看| 国产91成人video| 国产精品偷伦一区二区| 国产婷婷97碰碰久久人人蜜臀| 日韩免费视频在线观看| 欧美大片免费观看在线观看网站推荐| 成人免费xxxxx在线观看| 亚洲国产成人精品久久久国产成人一区| 成人在线观看视频网站| 亚洲精品99久久久久中文字幕| 亚洲男人第一网站| 精品中文字幕视频| 亚洲国产精久久久久久久| 亚洲一级片在线看| 国产成人av网| 久久久精品视频在线观看| 法国裸体一区二区| 国产精品欧美日韩一区二区| 国产精品va在线播放| 亚洲精品v天堂中文字幕| 在线a欧美视频| 国色天香2019中文字幕在线观看| 欧美在线视频播放| 亚洲一区二区三区四区视频| 久久久久国色av免费观看性色| 亚洲色图17p| 国产色婷婷国产综合在线理论片a| 日韩亚洲欧美成人| 91亚洲国产成人精品性色| 91色视频在线导航| 国产精品久久97| 97在线免费观看| 日韩在线高清视频| 国产欧美婷婷中文| 国产精品美女网站| 日韩在线精品一区| 久热在线中文字幕色999舞| 午夜精品福利在线观看| 成人激情免费在线| 中文字幕亚洲欧美日韩2019| 亚洲美女喷白浆| 精品国产一区二区三区久久久| 亚洲视频在线观看| 97av在线视频免费播放| 日韩国产欧美精品在线| 欧美一区二区.| 亚洲人成在线观看| 成人免费视频在线观看超级碰| 国产精品扒开腿爽爽爽视频| 一区二区欧美激情| 欧美精品在线网站| 少妇精69xxtheporn| 欧美多人乱p欧美4p久久| 超碰91人人草人人干| 久久精品91久久久久久再现| 国产成人高潮免费观看精品| 91亚洲精品在线观看| 亚洲一区999| 欧美激情精品久久久| 精品国产乱码久久久久久虫虫漫画| 亚洲精品av在线播放| 欧美日韩国产第一页| 成人性教育视频在线观看| 美日韩丰满少妇在线观看| 亚洲欧美日韩另类| 久久久久久com| 亚洲精品电影久久久| 色噜噜狠狠狠综合曰曰曰88av| 欧美精品在线看| 国色天香2019中文字幕在线观看| 欧美色播在线播放| 国产999精品| 69影院欧美专区视频| 一区二区三区视频免费在线观看| 国产精品视频网址| 精品国产电影一区| 成人做爰www免费看视频网站| 日本欧美一二三区| 欧美性猛交xxxx黑人猛交| 最近2019中文字幕在线高清| 日韩欧美中文字幕在线播放| 在线看福利67194| 精品久久久久久中文字幕一区奶水| 92看片淫黄大片欧美看国产片| 欧美成人剧情片在线观看| 久久国产天堂福利天堂| 欧美日韩亚洲天堂| 久久免费视频在线| 97在线观看视频国产| 一级做a爰片久久毛片美女图片| 亚洲成人免费网站| 精品国产一区二区三区久久| 久久久久99精品久久久久| 日本精品免费一区二区三区| 日韩经典中文字幕在线观看| 中文在线资源观看视频网站免费不卡| 久久久中精品2020中文| 亚洲精品有码在线| 精品无人国产偷自产在线| 欧美亚洲激情视频| 一本久久综合亚洲鲁鲁| 在线免费观看羞羞视频一区二区| 成人444kkkk在线观看| 国产成人短视频| 久久69精品久久久久久久电影好| 国产精品视频网| 欧美一区二区大胆人体摄影专业网站| 7777kkkk成人观看| 欧美黑人性猛交| 欧美性xxxx在线播放| 2019中文字幕在线观看| 热re99久久精品国产66热| 成人春色激情网| 久久久久久久久久婷婷| 欧美在线免费视频| 亚洲人免费视频| 久久久久久久国产精品| 亚洲黄页网在线观看| 欧美日韩美女在线| 成人福利网站在线观看| 国产视频在线一区二区| 亚洲欧洲日韩国产| 欧洲成人免费aa| 欧美日在线观看| 91九色视频在线| 久久综合国产精品台湾中文娱乐网| 在线中文字幕日韩| 国产精品视频最多的网站| 亚洲xxxx3d| 亚洲一区二区三区xxx视频| 欧美激情欧美狂野欧美精品| 欧美成年人网站| 精品视频—区二区三区免费| 欧洲美女免费图片一区| 国产综合视频在线观看| 日韩精品视频观看| 91久久嫩草影院一区二区| 91精品国产综合久久男男| 日韩精品极品在线观看播放免费视频| 亚洲福利精品在线| 亚洲人成网站777色婷婷| 亚洲片av在线| 国产精品中文字幕在线观看| 欧美激情一区二区久久久| 日韩a**站在线观看| 日韩有码视频在线| 91精品国产综合久久男男| 97成人精品区在线播放| 亚洲最大福利视频| 中文字幕亚洲激情| 国产一区二区视频在线观看| 久久精品99久久香蕉国产色戒| 欧美极品少妇xxxxⅹ免费视频| 国产69精品久久久| 欧美精品手机在线| 在线电影欧美日韩一区二区私密| 成人免费网站在线|