某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:
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_;
};
今天二师兄的表现不错,除了最后一个问题,基本上都答上来了。让我们来看下这个问题:
我们可以看看GCC中std::string
的实现:
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
。当字符串的长度小于等于15
时,直接存在_M_local_buf
中,而不需要在堆中申请内存。当字符串长度大于15
时,在内存中申请一块内存,这块内存的起始地址保存在_M_dataplus
中,这块内存的容量保存在_M_allocated_capacity
中,而字符串的真实长度保存在_M_string_length
中。当向字符串中添加字符时,如果添加字符的长度大于 _M_allocated_capacity - _M_string_length
,则需要resize
,否则直接追加到_M_dataplus
保存的内存块中即可。
好了,今天的面试到这里就结束了。感谢小伙伴们的耐心阅读,咱们明天继续二师兄的面试之旅!