c++ string类型内存分配
#include <iostream> #include <cstdlib> #include <string> using std::string; using std::cout; using std::endl; //重写string类的new操作符,添加一个可以识别malloc操作的输出 void* operator new(std::size_t n){ cout<<"分配"<<n<<"字节"<<endl; return malloc(n); } void operator delete(void *p) throw(){ free(p); } int main(int argc, char const *argv[]) { string s="AA"; //直接初始化 printf("字符串字面量:%p ",&s); cout<<"初始化时的状态:"<<endl; cout<<"sizeof:"<<sizeof(s)<<endl; cout<<"size:"<<s.size()<<endl; cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl; for(size_t i=6;i<50;++i){ s.push_back(+); cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl; printf("地址:%p ",s.c_str()); cout<<i<<":"<<s<<endl; } cout<<"push_back(+)之后的内存尺寸是"<<endl; cout<<"sizeof:"<<sizeof(s)<<endl; cout<<"size:"<<s.size()<<endl; cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl; printf("字符串字面量:%p ",&"AAAA AAAA AAAA"); return 0; }
注意当s的长度达到16时,开始用new进行内存的分配;即s长度小于16分配在栈中,s长度大于等于16分配在堆中。 同时内存分配最少为15,比如s=“A”时,s.capacity()为15。 当s="AAAA AAAA AAAA A"时,s.capacity()为16。 当s="AAAA AAAA AAAA AAA"时,s.capacity()为18。 sizeof(s)永远为32。 当s.push_back()到超过s.capacity()时,s.capacity()每次增长为原来的两倍。同时s.c_str()的地址不发生变化。
下一篇:
Java 反射机制实现原理