最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++面試八股文之std::string實(shí)現(xiàn)方法

 更新時(shí)間:2023年06月19日 08:41:57   作者:二進(jìn)制架構(gòu)  
這篇文章主要介紹了C++面試八股文:std::string是如何實(shí)現(xiàn)的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第18面:

面試官:std::string用過(guò)吧?

二師兄:當(dāng)然用過(guò)(廢話,C++程序員就沒(méi)有沒(méi)用過(guò)std::string的)。

面試官:std::string("hello")+"world"、"hello"+std::string("world")std::string("hello")+std::string("world")的結(jié)果是什么?為什么?

二師兄:前者和后者的結(jié)果都是std::string的對(duì)象,內(nèi)容是“helloworld\0”,而中間的這個(gè)表達(dá)式無(wú)法通過(guò)編譯。原因是std::string重載了operator+(const char*)operator+(const std::string&),但是const char* 卻沒(méi)有重載operator+運(yùn)算符。

面試官:std::string 有兩個(gè)API,resizereserve,你知道它們之間的區(qū)別嗎?

二師兄:resize對(duì)應(yīng)的是size,resize可以改變字符串的大小。reserve對(duì)應(yīng)的是capacityreserve只能改變capacity的大小。

二師兄:當(dāng)resize傳入的參數(shù)小于字符串的szie時(shí),多余的字符串會(huì)被截取。當(dāng)reserve傳入的參數(shù)小于capacity時(shí),reserve什么也不會(huì)做。

二師兄:當(dāng)resize傳入的參數(shù)大于字符串的szie時(shí),增加的字符串會(huì)被默認(rèn)初始化。當(dāng)reserve傳入的參數(shù)大于capacity時(shí),capacity會(huì)被擴(kuò)容。

面試官:好的??梢酝ㄟ^(guò)下標(biāo)訪問(wèn)std::string實(shí)例的內(nèi)容嗎?

二師兄:可以的,std::string重載了下標(biāo)運(yùn)算符,可以像數(shù)組一樣通過(guò)下標(biāo)運(yùn)算取出某個(gè)字符。

面試官:你知道std::stringat成員方法嗎?

二師兄: 嗯,和下標(biāo)運(yùn)算功能相似,不過(guò)不用擔(dān)心越界問(wèn)題??梢园踩脑L問(wèn)字符串中的字符。

面試官:既然有at方法了,為什么還要重載下標(biāo)運(yùn)算符呢?

二師兄:主要是因?yàn)樾阅苌系目剂俊?code>at雖然保證了不會(huì)超出字符串范圍(超出范圍拋出異常),但是性能低于下標(biāo)操作。這就是有舍有得。為了安全使用at,為了性能使用下標(biāo)操作。C++給了你多個(gè)選擇,如何選擇看你的需求。

面試官:那你知道std::string是如何實(shí)現(xiàn)的嗎?

二師兄:在string內(nèi)部維護(hù)一個(gè)指針,這個(gè)指針指向真正的字符串的位置。

面試官:能簡(jiǎn)單的寫(xiě)一下實(shí)現(xiàn)代碼嗎?

二師兄:好的。

class string
{
public: 
    string():size_(0),data_(nullptr){}
    explicit string(const char* c)
    {
        size_ = strlen(c);
        data_ = (char*)malloc(size_+1);
        memset(data_,0,size_+1);
        memcpy(data_,c,size_);
    }
    size_t size() const {return size_;}
	const char* c_str() const {return data_;}
private:
    size_t size_;
    char* data_;
};

二師兄:在實(shí)現(xiàn)append或者+=的時(shí)候,需要把當(dāng)前字符的長(zhǎng)度加上append的內(nèi)容的長(zhǎng)度,以此長(zhǎng)度申請(qǐng)一塊新內(nèi)存,然后把當(dāng)前字符串的內(nèi)存和append 的內(nèi)容考入新申請(qǐng)的內(nèi)存中。free掉之前data_指向的內(nèi)存,然后把data_指針指向新申請(qǐng)的內(nèi)存。

面試官:好的。這樣的實(shí)現(xiàn)有一些弊端。如果頻繁的對(duì)一個(gè)std::string對(duì)象append內(nèi)容,會(huì)發(fā)生什么?

二師兄:是的,因?yàn)轭l繁的mallocfree,會(huì)有性能問(wèn)題。因所以編譯器在實(shí)現(xiàn)std::string的時(shí)候一般會(huì)預(yù)先申請(qǐng)一塊大的內(nèi)存,這塊內(nèi)存的長(zhǎng)度是capacity,當(dāng)添加的字符串的長(zhǎng)度加上當(dāng)前的字符串長(zhǎng)度小于capacity時(shí),直接添加到當(dāng)前的塊上即可。

面試官:好的。針對(duì)字符串比較少的情況,一般編譯器會(huì)做一些優(yōu)化,你知道如何優(yōu)化的嗎?

二師兄:這個(gè)好像在哪看過(guò),不記得額。。。

面試官:好的,今天的面試結(jié)束了,請(qǐng)回去等通知吧。

今天二師兄的表現(xiàn)不錯(cuò),除了最后一個(gè)問(wèn)題,基本上都答上來(lái)了。讓我們來(lái)看下這個(gè)問(wèn)題:

針對(duì)字符串比較少的情況,一般編譯器會(huì)做一些優(yōu)化,你知道如何優(yōu)化的嗎?

我們可以看看GCC中std::string的實(shí)現(xiàn):

 typedef basic_string<char>    string;   
_Alloc_hider	_M_dataplus;
size_type		_M_string_length;
enum { _S_local_capacity = 15 / sizeof(_CharT) };
union
{
    _CharT           _M_local_buf[_S_local_capacity + 1];
    size_type        _M_allocated_capacity;
};

這里的_CharT就是char,所以_S_local_capacity等于15。當(dāng)字符串的長(zhǎng)度小于等于15時(shí),直接存在_M_local_buf中,而不需要在堆中申請(qǐng)內(nèi)存。當(dāng)字符串長(zhǎng)度大于15時(shí),在內(nèi)存中申請(qǐng)一塊內(nèi)存,這塊內(nèi)存的起始地址保存在_M_dataplus中,這塊內(nèi)存的容量保存在_M_allocated_capacity 中,而字符串的真實(shí)長(zhǎng)度保存在_M_string_length中。當(dāng)向字符串中添加字符時(shí),如果添加字符的長(zhǎng)度大于 _M_allocated_capacity - _M_string_length,則需要resize,否則直接追加到_M_dataplus保存的內(nèi)存塊中即可。

好了,今天的面試到這里就結(jié)束了。

到此這篇關(guān)于C++面試八股文之std::string實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)std::string內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談VC中預(yù)編譯的頭文件放那里的問(wèn)題分析

    淺談VC中預(yù)編譯的頭文件放那里的問(wèn)題分析

    本篇文章是對(duì)VC中預(yù)編譯的頭文件放那里的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果

    深入分析父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果

    本篇文章是對(duì)父子線程、進(jìn)程終止順序不同產(chǎn)生的結(jié)果進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++ 有趣的動(dòng)態(tài)轉(zhuǎn)換

    c++ 有趣的動(dòng)態(tài)轉(zhuǎn)換

    這篇文章主要介紹了c++ 動(dòng)態(tài)轉(zhuǎn)換的相關(guān)資料,幫助大家更好的理解和使用c++編程,感興趣的朋友可以了解下
    2020-09-09
  • 詳解C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧

    詳解C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧

    這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 從使用角度解讀c++20 協(xié)程示例

    從使用角度解讀c++20 協(xié)程示例

    類比線程,線程是個(gè)函數(shù),把這個(gè)函數(shù)交給 創(chuàng)建線程的api,然后這個(gè)函數(shù)就變成線程了,這個(gè)函數(shù)本身沒(méi)有任何特殊的地方,就是普通函數(shù),這篇文章主要介紹了從使用角度解讀c++20 協(xié)程示例,需要的朋友可以參考下
    2023-01-01
  • C++超詳細(xì)講解樹(shù)與二叉樹(shù)

    C++超詳細(xì)講解樹(shù)與二叉樹(shù)

    在之前的文章里,我們學(xué)習(xí)的一直是一對(duì)一的線性結(jié)構(gòu),可現(xiàn)實(shí)中,還有很多一對(duì)多的情況需要處理,所以我們需要研究這樣一種一對(duì)多的數(shù)據(jù)結(jié)構(gòu)——樹(shù)
    2022-05-05
  • C++?路徑中./、../、/代表的含義

    C++?路徑中./、../、/代表的含義

    這篇文章主要介紹了C++?路徑中./、../、/代表的含義,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++定時(shí)器實(shí)現(xiàn)和時(shí)間輪介紹

    C++定時(shí)器實(shí)現(xiàn)和時(shí)間輪介紹

    這篇文章主要介紹了C++定時(shí)器實(shí)現(xiàn)和時(shí)間輪介紹,定時(shí)器可以由很多種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),比如最小堆、紅黑樹(shù)、跳表、甚至數(shù)組都可以,其本質(zhì)都是拿到最小時(shí)間的任務(wù),然后取出該任務(wù)并執(zhí)行,更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-09-09
  • C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二)

    C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(82.移除有序鏈表中的重復(fù)項(xiàng)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言 位段的詳細(xì)介紹

    C語(yǔ)言 位段的詳細(xì)介紹

    這篇文章主要介紹了C語(yǔ)言 位段的詳細(xì)介紹的相關(guān)資料,學(xué)習(xí)C語(yǔ)言基礎(chǔ)的朋友,可以參考本文,需要的朋友可以參考下
    2016-11-11

最新評(píng)論

涞水县| 巴里| 沐川县| 镇坪县| 板桥市| 武川县| 南丹县| 玛多县| 广东省| 广东省| 曲麻莱县| 甘泉县| 永川市| 光泽县| 朝阳区| 崇信县| 绥化市| 庆阳市| 本溪市| 昌吉市| 左贡县| 登封市| 昌吉市| 河西区| 长汀县| 江阴市| 即墨市| 广东省| 闵行区| 连平县| 曲松县| 抚州市| 岑溪市| 建平县| 岳西县| 鄂温| 巍山| 清涧县| 读书| 舟曲县| 东源县|