在QT的Reference中无意看到了QString及其他类型数据结构内存的分配策略,翻译并记录一下。

  在QString的数据结构中,QString通过一次附加一个字符来动态构建字符串。假设我们向QString字符串追加15000个字符。然后,当QString空间不足时,会发生以下18个重新分配的过程(假设目前有15000个字符):

  4,8,12,16,20,52,116,244,500,1012,2036,4084,6132,8180,10228, 12276、14324、16372

  最后,QString分配了16372个Unicode字符,其中15000个被占用。

  上面的内存分配状况看起来比较奇怪,以下是内存分配原则:

  1、QString一次分配4个字符,直到达到大小20。
  2、从20到4084,每次将大小增加一倍。更准确地说,它的内存分配量扩大到2的下一个乘方数减去12。(某些内存分配器在要求精确的2的乘方数时表现最差,因为它们每个块还需要使用额外的几个字节进行记录。)
  3、从4084开始,每次分配2048个字符(4096字节)的内存块。因为现代操作系统在重新分配缓冲区时不会复制整个数据。只需简单地对物理内存页面进行重新排序,并且实际上只需要复制首页和最后一页上的数据。

  QByteArray和QList <T>使用与QString大致相同的算法。

  QVector <T>还将该算法用于可以使用memcpy()在内存中移动的数据类型(包括基本的C++类型,指针类型和Qt的共享类),但对只能用于通过调用复制构造函数和析构函数进行移动。由于在这种情况下重新分配的成本较高,因此QVector <T>在空间不足时,始终通过将内存翻倍来减少重新分配的次数。

  QHash <Key,T>是完全不同的情况。 QHash的内部哈希表以2的幂次方增长,并且每次增长时,这些项都将重新放置在新的存储桶中,计算方式为qHash(key)%QHash::capacity()(存储桶数)。此注释也适用于QSet <T>和QCache <Key,T>。

  对于大多数应用程序,Qt提供的默认增长算法可以解决问题。如果需要更多控制,QVector <T>,QHash <Key,T>,QSet <T>,QString和QByteArray提供了三个函数,可让您检查并指定用于存储项目的内存量:

  1、Capacity()返回为其分配内存的项目数(对于QHash和QSet,为哈希表中的存储桶数)。
  2、reserve(size)显式预分配大小项目的内存。
  3、squeeze()释放不需要存储项目的任何内存。
  如果在一开始就知道一个容器中存储大约多少个项目,则可以通过调用reserve()将内存分配完成,减少过程中不必要的内存分配,并在完成容器的填充后,可以调用squeeze()释放额外的预分配内存。

QT数据结构内存分配策略的更多相关文章

  1. java中内存分配策略及堆和栈的比较

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  2. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  3. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  4. 深入理解Java虚拟机读书笔记2----垃圾收集器与内存分配策略

    二 垃圾收集器与内存分配策略 1 JVM中哪些内存需要回收?     JVM垃圾回收主要关注的是Java堆和方法区这两个区域:而程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生,随线程而灭,随着方 ...

  5. 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...

  6. Java自动内存管理机制学习(二):垃圾回收器与内存分配策略

    备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...

  7. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  8. 深入了解Java虚拟机(2)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否 ...

  9. jvm-垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 参考: https://my.oschina.net/hosee/blog/644085 http://www.cnblogs.com/zhguang/p/Java-JVM- ...

  10. JVM内存分配策略,及垃圾回收算法

    本人免费整理了Java高级资料,一共30G,需要自己领取;传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 说起垃圾收集(Garbage Co ...

随机推荐

  1. 关于邮箱怎么验证是不是真实的企业邮箱(java汉字和英文呼唤)

    企业邮箱的域名一般都是zhangsan@公司域名,或者zhang_san@公司域名这种形式.这里我只列举zhangsan@公司域名这种形式. 公司要我做一个企业邮箱的模糊匹配和验证,刚接到以为很难.结 ...

  2. VS Code:4个中文乱码问题及解决方法-转载

    https://www.jianshu.com/p/6a2c21cc07bb   1. 背景   凡是编程软件,特别是国外的软件,都有或多或少的中文乱码问题(毕竟程序都是用英文写的).现提出VS Co ...

  3. [CSP-S2019] Emiya 家今天的饭

    洛咕 题意:原题面见链接,简单来说就是给出一个\(n*m\)的矩阵,每一行代表同一种烹饪方法,每一列代表同一种食材,\(a_{i,j}\)表示使用第i种烹饪方法第j种食材能做出多少种菜,要求至少做一道 ...

  4. nop 中创建任务(Task)

    NopCommerce 中Task 原理是服务端开启线程定时跑. 1.在数据表ScheduleTask中添加一条数据, 2.自定义类,继承ITask 即可 using Data.Log4Net; us ...

  5. C# 开源NuGet插件

    ExcelDataReader  开源免费,Excel读取插件 GitHub - ExcelDataReader/ExcelDataReader: Lightweight and fast libra ...

  6. cublas fp16

    编译选项: nvcc 4.cpp -o test_gemm  -lcudart -lcuda -lcublas -std=c++11 #include <sys/time.h> #incl ...

  7. Python学习笔记组织文件之将美国风格日期的文件改名为欧洲风格的日期

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  8. react 富文本编辑器

    5大富文本编辑器今天,富文本编辑器被用于许多应用中,包括简单的博客和复杂的内容管理系统.然而,选择一个并不容易,因为有很多具有不同功能的编辑器. 因此,在这篇文章中,我将评估5个React的富文本编辑 ...

  9. java乱码处理

    package com.zhouhe.util; import java.io.UnsupportedEncodingException; /** * 自定义工具类 * @Author zhouhe ...

  10. golang 指针

    一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针. 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置.使用&字符放在变量前面对变量进行" ...