VisualStudio下std::string的内存布局

主要成员

?





1

2

3

4

5

6

7

8

union _Bxty

    {   // storage for small buffer or pointer to larger one

    _Elem _Buf[_BUF_SIZE];

    _Elem *_Ptr;

    } _Bx;

size_type _Mysize;  // current length of string

size_type _Myres;   // current storage reserved for string

其中,_Bx保存着string的真正成员,如果string长度在16以内,可以直接存放到string对象的内部;

否则,_Bx._Ptr保存存放真正内容的指针;

当string长度增长时,会重新分配更大的内存空间,并且将原来的字符串拷贝至新分配的空间中去。

在Visual Studio下,sizeof(str1) = 0x00000020 = 32个字节

时间: 2024-08-03 09:02:14

VisualStudio下std::string的内存布局的相关文章

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象,共同使用一块内存: 1.关于string的内存共享问题: 通常,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存. 因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返

【转】标准C++类std::string的内存共享和Copy-On-Write技术

1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是"拖延战术",直到你非要做的时候才去做. 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变

win x64下C++对象的内存布局的学习

这篇文章是在学习陈皓的一篇文章<C++对象的内存布局(上)>后,针对x64的下情况的学习笔记.他的文章的链接地址是:http://blog.csdn.net/haoel/article/details/3081328. 他的示例代码中有下列片段: 如果在vs2015社区版中以debug方式编译出x64版本的exe运行后会崩溃.经过调试发现在x64下地址是以unsigned long long表示的(如果测试发现,编译后台实际上会把unsigned long long 转换为unsigned _

Linux下C程序的内存布局

参考下列书籍中的对应章节: <Linux高级程序设计(第3版)>第3章Linux进程存储管理.相关视频:一.二. <C专家编程>第6章 运动的诗章:运行时数据结构. <UNIX环境高级编程(第2版)>第7章 进程环境  7.6 C程序的存储空间布局. 理解了上述知识就很容易明白,一个函数返回char *时的内存分配处理方案. char * func(...); 参考<C专家编程>P48

多重虚继承下的对象内存布局

<深入C++对象模型>绝对是一本值得深读的一本书,书里多次出现一句话,“一切常规遇见虚继承,都将失效”.这是一个有趣的问题,因为C++标准容忍对象布局的实现有较大的自由,出现了各编译器厂商实现的方式不同. 今天谈谈visual studio2013多重虚继承下对象布局.有错不要客气,不要吝啬你的留言,请直接开喷. class y和class z都是从class x虚继承来的子类(也叫派生类),class A是class y和class z的多重继承子类.为了简化问题,下面的data membe

.net托管环境下struct实例字段的内存布局(Layout)和大小(Size)

在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Align):当然我们也可以通过设置或编码来设置内存对齐的方式. 然而在.net托管环境中,CLR提供了更自由的方式来控制struct中Layout:我们可以在定义struct时,在struct上运用StructLayoutAttribute特性来控制成员的内存布局.默认情况下,struct实例中的字段在栈

std::string在多字节字符集环境下substr的实现方法

昨天写到<使用多字节字符集的跨平台(PC.Android.IOS.WP)编码/解码方法>中提到服务端使用std::string处理字符串,std::string对多字节字符集支持并不是很完善,std::string中的函数没有对多字节字符集进行直接的支持. 例如直接调用std::string的substr函数,就会导致某些情况下截取的字符串尾部产生非法字符. GB系列多字节字符集基础知识: VC环境下工程设置为多字节字符集,默认使用的是GBK编码,GB2312.GBK.GB18030,这3个都

Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露

在使用 Connect/C++ ,测试时发现在调用 getString 出现了内存增长的情况. ConstructOutput(); //打印出当前内存 for(int i=0;i<1000;++i) { prepareState.reset(con->prepareStatement("call test.testproc3(?)")); prepareState->setInt(1,1001); prepareState->executeUpdate();

C++ 对象的内存布局(下)

重复继承 下面我们再来看看,发生重复继承的情况.所谓重复继承,也就是某个基类被间接地重复继承了多次. 下图是一个继承图,我们重载了父类的f()函数. 其类继承的源代码如下所示.其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己的虚函数,自己overwrite父类的虚函数.如子类D中,f()覆盖了超类的函数, f1() 和f2() 覆盖了其父类的虚函数,Df()为自己的虚函数. class B { public: int ib; char cb; public: B