第二章P32頁:如何選擇正確的類型.

在C++ Primer的第二章里面討論了該如何選擇正確的類型,這里是些自己的看法盾致,和書上的不全一樣。

char, short, int and long

  • int類型一般是處理器最自然的長度,所以一般無特殊需求,都使用int來做整數(shù)運(yùn)算心剥。
  • 只用char類型來表示可打印的字符。
  • unsigned char或者#typedef unsigned char BYTE來表示一塊內(nèi)存數(shù)據(jù)背桐,比如說一個(gè)二進(jìn)制文件的內(nèi)容优烧。
  • signed char, shortlong通常不用。

signed integer vs unsigned integer

  • 任何涉及到加減乘除算數(shù)計(jì)算的情況下链峭,都要用signed integer畦娄。哪怕是當(dāng)時(shí)看起來沒有產(chǎn)生負(fù)數(shù)的可能性,為了避免將來修改代碼的時(shí)候混用有符號類型和無符號類型弊仪,還是建議都是用有符號類型熙卡。
  • 任何涉及到左移,右移撼短,位運(yùn)算的情況下再膳,都要使用unsigned integer挺勿。這個(gè)時(shí)候我們需要的變量不是一個(gè)數(shù)字曲横,而是一堆bit。最重要的是不瓶,如果對負(fù)數(shù)右移的時(shí)候禾嫉,首位是補(bǔ)0還是1是編譯器實(shí)現(xiàn)相關(guān)的,所以不能使用有符號類型蚊丐。

Fixed-Precision Integer Types

除了intlong這樣子沒有規(guī)定具體大小的類型以為熙参,C++11還有一系列固定精度的整形,定義在頭文件cstdint中麦备,它們是int8_t int16_t int32_t int64_t和對應(yīng)的無符號類型孽椰。在這些情況下昭娩,你需要一個(gè)變量表示某個(gè)硬件上的32位的寄存器;你需要一個(gè)變量表示ipv4的地址黍匾;這些情況最好使用固定精度的整形栏渺。如果你只用個(gè)int來表示的下,在不同的編譯器下可能會大小不一樣锐涯,而造成問題磕诊。

double Vs float

如果精度允許,首選float來提升程序性能纹腌。

  • 在很多機(jī)器上霎终,計(jì)算double和float的速度是一樣的。比如說在x86的機(jī)器上升薯,double和float都會被擴(kuò)展成為80bits的浮點(diǎn)數(shù)來計(jì)算莱褒。
  • 但是除了計(jì)算速度,還要考慮memory和cache的問題涎劈。double意味著需要更大的memory bandwidth保礼,以及更大的cache壓力。
  • 在SIMD指令上责语,使用float也比double快炮障,因?yàn)橐粭l指令能處理更多的float數(shù)字。參考Intel 64 and IA-32 Architectures Optimization Reference Manual 里面的內(nèi)容坤候。
SIMD

使用void*來表示地址類型胁赢。

  • 使用unsigned int或者unsigned long來表示地址是嚴(yán)格禁止的,因?yàn)樗麄兊拈L度不是確定白筹。
  • 使用int32_t或者int64_t也不是好主意智末,這樣就不具有32位和64位的可移植性了。
  • 如果對兩個(gè)指針做減法徒河,可以static_cast<char*>來計(jì)算系馆,并且使用ptrdiff_t來保存返回值以確保可移植性顽照。
  • 如果要對地址進(jìn)行位運(yùn)算由蘑,那么可以使用intptr_tuintptr_t類型,這兩個(gè)類型是C++11里面新引入的代兵。他們是個(gè)足夠大到保存指針的的integer類型尼酿。這樣子用reinterpret_cast<intptr_t>(p1);

size_t, size_type, difference_type Or integer type

為什么需要size_t, size_type, difference_type

    vector<int>::size_type size = v.size();
    vector<int>::difference_type diff = v.begin() - v.end();

v.size()具體能有多大完全是平臺相關(guān)的,比如說32位CPU下植影,最大也只能是4G裳擎。但是64bit下就要大的多。所以如果使用int或者long之類的保存v.size()的值思币,其可移植性不好鹿响,要么是太小無法保存其值羡微,要么是太大浪費(fèi)了效率。所以就定義了這些特別的類型惶我。

std::size_t is the unsigned integer type of the result of the sizeof operator
difference_type provides the difference between two iterators that refer to elements within the same vector.
size_type represents the number of elements in a vector.

選擇size_type還是int呢拷淘?

    for (int i = 0; i < v.size(); i++); // warning in some compiler
    for (vector<int>::size_type i = 0; i < v.size(); i++);
    for (decltype(v.size()) i = 0; i < v.size(); i++);

個(gè)人的習(xí)慣

  • 如果我在寫一個(gè)跨平臺,準(zhǔn)備給很多人用的指孤,完全無法預(yù)知要處理的數(shù)據(jù)能有多大的情況下启涯,那么肯定不能使用int之類的類型。但要注意恃轩,size_type都是無符號類型结洼,如果后續(xù)需要進(jìn)行數(shù)值運(yùn)算,需要小心處理和有符號數(shù)一起計(jì)算的情況叉跛。
  • 大多數(shù)情況下松忍,我的代碼的使用場景有限,我確定一個(gè)int肯定能夠裝下v.size()筷厘,那么我就會使用int鸣峭。好處不用太關(guān)心有符號和無符號混用的問題。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酥艳,一起剝皮案震驚了整個(gè)濱河市摊溶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌充石,老刑警劉巖莫换,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骤铃,居然都是意外死亡拉岁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門惰爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊暖,“玉大人,你說我怎么就攤上這事撕瞧×赀矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵风范,是天一觀的道長咨跌。 經(jīng)常有香客問我,道長硼婿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任禽车,我火速辦了婚禮寇漫,結(jié)果婚禮上刊殉,老公的妹妹穿的比我還像新娘。我一直安慰自己州胳,他們只是感情好记焊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栓撞,像睡著了一般遍膜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓤湘,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天瓢颅,我揣著相機(jī)與錄音,去河邊找鬼弛说。 笑死挽懦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的木人。 我是一名探鬼主播信柿,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼醒第!你這毒婦竟也來了渔嚷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤稠曼,失蹤者是張志新(化名)和其女友劉穎圃伶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒲列,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窒朋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝗岖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥猩。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抵赢,靈堂內(nèi)的尸體忽然破棺而出欺劳,到底是詐尸還是另有隱情,我是刑警寧澤铅鲤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布划提,位于F島的核電站,受9級特大地震影響邢享,放射性物質(zhì)發(fā)生泄漏鹏往。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一骇塘、第九天 我趴在偏房一處隱蔽的房頂上張望伊履。 院中可真熱鬧韩容,春花似錦、人聲如沸唐瀑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哄辣。三九已至请梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間力穗,已是汗流浹背毅弧。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睛廊,地道東北人形真。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像超全,于是被迫代替她去往敵國和親咆霜。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,917評論 6 13
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)嘶朱。 張土汪:刷leetcod...
    土汪閱讀 12,737評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蛾坯,服務(wù)發(fā)現(xiàn),斷路器疏遏,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 01 我很想努力啊脉课,可就是努力不起來! 很多時(shí)候财异,每天要做的事情我會一項(xiàng)項(xiàng)地去完成倘零,可是最近就是不想去做。連這篇文...
    燈R閱讀 194評論 0 0
  • 清醒之際開封一瓶沉睡10年的瀘賓卡斯特,一股迷香襲人沉醉一聲“吩”疫鹊。亦得到天馬星空的思維袖瞻。人生的意義在于怎樣實(shí)現(xiàn)幸...
    靜靜在等你閱讀 845評論 1 2