string底层实现之SSO
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方法。