欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

面試官:std::string用過吧?

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

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

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

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

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

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

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

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

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

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

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

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

二師兄:主要是因為性能上的考量。at雖然保證了不會超出字符串范圍(超出范圍拋出異常),但是性能低于下標(biāo)操作。這就是有舍有得。為了安全使用at,為了性能使用下標(biāo)操作。C++給了你多個選擇,如何選擇看你的需求。

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

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

面試官:能簡單的寫一下實現(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_;
};

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

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

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

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

二師兄:這個好像在哪看過,不記得額。。。

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

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

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

我們可以看看GCC中std::string的實現(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)字符串的長度小于等于15時,直接存在_M_local_buf中,而不需要在堆中申請內(nèi)存。當(dāng)字符串長度大于15時,在內(nèi)存中申請一塊內(nèi)存,這塊內(nèi)存的起始地址保存在_M_dataplus中,這塊內(nèi)存的容量保存在_M_allocated_capacity 中,而字符串的真實長度保存在_M_string_length中。當(dāng)向字符串中添加字符時,如果添加字符的長度大于 _M_allocated_capacity - _M_string_length,則需要resize,否則直接追加到_M_dataplus保存的內(nèi)存塊中即可。

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

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

相關(guān)文章

  • 用C語言實現(xiàn)簡單的三子棋

    用C語言實現(xiàn)簡單的三子棋

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)三子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++?函數(shù)重載背后的原理

    C++?函數(shù)重載背后的原理

    這篇文章主要介紹了C++?函數(shù)重載背后的原理,我們不僅僅需要學(xué)會重載的使用,更要了解C++為什么支持函數(shù)重載,下面我們一起進入文章學(xué)習(xí)該內(nèi)容吧
    2022-05-05
  • C++ lambda 捕獲模式與右值引用的使用

    C++ lambda 捕獲模式與右值引用的使用

    這篇文章主要介紹了C++ lambda 捕獲模式與右值引用的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Linux系統(tǒng)中C語言編程創(chuàng)建函數(shù)fork()執(zhí)行解析

    Linux系統(tǒng)中C語言編程創(chuàng)建函數(shù)fork()執(zhí)行解析

    最近在看進程間的通信,看到了fork()函數(shù),雖然以前用過,這次經(jīng)過思考加深了理解?,F(xiàn)總結(jié)如下
    2013-04-04
  • C++中的構(gòu)造函數(shù)詳解

    C++中的構(gòu)造函數(shù)詳解

    這篇文章主要介紹了C++ 中構(gòu)造函數(shù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++中const、volatile、mutable使用方法小結(jié)

    C++中const、volatile、mutable使用方法小結(jié)

    這篇文章主要介紹了C++中const、volatile、mutable使用方法小結(jié),需要的朋友可以參考下
    2020-01-01
  • Gstreamer基礎(chǔ)知識教程

    Gstreamer基礎(chǔ)知識教程

    由于deepstream是基于gstreamer的,所以要想在deepstream上做拓展,需要對gstreamer有一定的認識,以下主要介紹Gstreamer整體框架和Gstreamer基礎(chǔ)概念,需要的朋友可以參考下
    2022-07-07
  • QT與MATLAB混合編程的詳細教程

    QT與MATLAB混合編程的詳細教程

    最近項目需要,matlab的一些算法需要工程用,因此需要直接轉(zhuǎn)成Qt能夠調(diào)用的形式,下面這篇文章主要給大家介紹了關(guān)于QT與MATLAB混合編程的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C語言?typedef的用法示例詳解

    C語言?typedef的用法示例詳解

    typedef是在C和C++編程語言中的一個關(guān)鍵字,作用是為現(xiàn)有的數(shù)據(jù)類型(int、float、char……)創(chuàng)建一個新的名字,目的是為了使代碼方便閱讀和理解,這篇文章主要介紹了C語言typedef的使用,需要的朋友可以參考下
    2023-06-06
  • 利用C++實現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    利用C++實現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    通訊錄是一個可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關(guān)于利用C++實現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論