c++中string底层实现之SSO


string底层实现之SSO

string的构造函数

参考资料

Simple String Optimization,最小字符串优化,基本原理是:当分配的字节数小于16字节的时候,直接从栈上进行进行内存分配,如果大于16字节,则在堆上进行内存分配。

验证一下:

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
void *operator new(size_t n){
    cout<<"new size="<<n;
    return malloc(n);
}
void operator delete(void* p){
    free(p);
}
int main(){
    for(int i=0; i<30; i++){
        cout<<"i="<<i<<": "<<string(i, '=')<<endl;
    }
    return 0;

}

这里对new进行了重载,以便我们观察是否调用的new。

root@***********************:~# g++ -o test test.cpp 
root@***********************:~# ./test
i=0: 
i=1: =
i=2: ==
i=3: ===
i=4: ====
i=5: =====
i=6: ======
i=7: =======
i=8: ========
i=9: =========
i=10: ==========
i=11: ===========
i=12: ============
i=13: =============
i=14: ==============
i=15: ===============
i=16: new size=17================
i=17: new size=18=================
i=18: new size=19==================
i=19: new size=20===================
i=20: new size=21====================
i=21: new size=22=====================
i=22: new size=23======================
i=23: new size=24=======================
i=24: new size=25========================
i=25: new size=26=========================
i=26: new size=27==========================
i=27: new size=28===========================
i=28: new size=29============================
i=29: new size=30=============================

这就说明当字符串长度小于16时,是在栈上面分配内存,大于16的时候,在堆上分配内存,也就是调用了new方法。


文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录