c++14对内存分配性能的重大优化

Table of Contents

  • 1. 本质需求
  • 2. 存在的问题
  • 3. 解决方案

简述, C++14标准对内存优化的描述修改, 会让编译器引入类似TCMalloc的内存分配优化策略, 而不拘泥于原来的有一个new语句,就分配一次内存的傻傻的情况. 因此有理由相信用C++14的编译器编译出来的c++程序在内存分配上性能会有较多提升. 下面的文字来源于clang编译器提供的文档, 我对其主要内容进行了意译. 个人感觉是, 不再需要引入TCMalloc库来帮助提升性能, 直接使用c++14就行了.

1 本质需求

需要优化内存分配和回收

  • 内存的分配和回收已经成为现代系统很重要的成本.
  • 区分内存分配优化和调用优化
  • 好的系统性能需要对应用的动态行为适配不同的分配策略, 或者根据应用提供的线索采用不同的分配策略.

2 存在的问题

  • 当前C/C++标准可能会导致

    • 分配策略只考虑与new/delete语句顺序有关的事情, 而忽略其他重要的有助于优化的信息
    • 分配策略只考虑为每一句new语句执行分配内存的调用语句,而忽略分配的优化

3 解决方案

建议修改标准文档的措辞,使得更加准确的聚焦在本质需求上, 使得某些编译器和内存分配器已经支持的优化行为得到体现,比如TCMalloc.

  • 在某些情况下, 内存分配函数的调用次数在程序中不能被观察到. 这样允许实现者可以减少调用的次数(通过避免调用或者合并调用)
  • 避免调用或者合并调用所分配的空间不会超过代码中new语句要求分配的, 只有一种例外,就是为了适应内存对齐要求而需要用额外的内存填补缝隙.

此建议不适用于class-specific 内存分配器

Author: dean

Created: 2015-12-27 日 16:17

Validate

时间: 2024-10-08 12:08:31

c++14对内存分配性能的重大优化的相关文章

C++ Primer 学习笔记_99_特殊工具与技术 --优化内存分配[续1]

特殊工具与技术 --优化内存分配[续1] 三.operator new函数和operator delete 函数 – 分配但不初始化内存 首先,需要对new和delete表达式怎样工作有更多的理解.当使用new表达式 string *sp = new string("initialized"); 的时候,实际上发生三个步骤: 1)首先,表达式调用名为operator new 的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象; 2)接下来,运行该类型的一个构造函数

JVM内存分配调优

Reference: https://time.geekbang.org/column/article/108139 参考指标 GC频率:?频的FullGC会给系统带来?常?的性能消耗,虽然MinorGC相对FullGC来说好了许多,但过多的MinorGC仍会给系统带来压?. 内存:这?的内存指的是堆内存??,堆内存又分为年轻代内存和?年代内存.?先我们要分析堆内存??是否合适,其实是分析年轻代和?年代的?例是否合适.如果内存不?或分配不均匀,会增加FullGC,严重的将导致CPU持续爆满,影响

Memcache 内存分配策略和性能(使用)状态检查

前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作.有兴趣的同学可以查看之前写的文章和Google. 1:参数 memcached -h memcached 1.4.14 -p <num> TCP端口,默认为11211,可以不设置 -U <num> UDP端口,默认为11211,0为关闭 -s <file> UNIX soc

Android性能调优篇之探索JVM内存分配

详细内容请查看我的简书地址:Android性能调优篇之探索JVM内存分配 或者我的个人博客地址:Android性能调优篇之探索JVM内存分配

JVM性能调优 第七章 内存分配策略

理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直接分配到Eden区域,如果Eden区域内存不够,JVM就会触发GC(垃圾回收),一般来说在JVM中有3种GC: Minor GC:指发生在新生代的垃圾收集动作,非常频繁,速度较快. Major GC:指发生在老年代的GC,出现Major GC,经常会伴随一次Minor GC,同时Minor GC也会

SQL Server -&gt;&gt; Memory Allocation Mechanism and Performance Analysis(内存分配机制与性能分析)之 -- Minimum server memory与Maximum server memory

Minimum server memory与Maximum server memory是SQL Server下配置实例级别最大和最小可用内存(注意不等于物理内存)的服务器配置选项.它们是管理SQL Server内存的途径之一. Minimum server memory与Maximum server memory Minimum server memory(MB): 最小服务器内存.一旦超过这个线就不会再把内存换回去.但是也不是说SQL Server一启动马上就申请这么多的内存. Maximum

动态内存分配PK栈区分配(性能还是灵活性)

       为什么要申请动态内存分配使用权的问题:我想自己以前是根本没有任何的经验的.我的程序中几乎没有在堆中申请动态内存,全部都是在栈区中建立数组,但是数组的长度是有限的,根据测试表明,数组的存储的容量大概是400KB,所以在实现加解密程序的时候,仅仅是为了达到要求,并没有使用动态分配的技术.假设一个整型变量存储一个汉字的话,能够存储的字符个数大概是10万个汉字,那么动态分配的存储个数更是庞大.我的程序应该尝试使用并且懂得如何释放. int* number=new int [10000000

2015.12.14 宏定义 枚举 动态内存分配

宏定义 (#define) 宏定义的意义和用途:(习惯上,都是“k”开头) 1.为了让一些数据有意义. 2.类似于内联函数(使用简便). 3.输出日志的开关. (非零即真,0为“发布阶段”,1为“开发阶段”) 枚举 (enum) 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 默认情况下,枚举中每个元素的基础类型是 int.可以使用冒号指定另一种整数值类型.默认是从0开始,后者会在前者之上+1. 动态内

【转载】C++内存分配

原文:C++内存分配 内存泄露相信对C++程序员来说都不陌生.解决内存泄露的方案多种多样,大部分方案以追踪检测为主,这种方法实现起来容易,使用方便,也比较安全. 首先我们要确定这个模块的主要功能: 能追踪内存的分配和释放过程. 要能显示内存分配的相关信息,比如内存块大小,代码所在文件所在行等. 在发现内存泄露时及时给出相关信息. 能正确处理一些异常情况,比如内存不足,对象初始化失败等等. 是线程安全的.[*这个还没有实现] 有了一些基本功能需求,我们需要考虑每种功能怎么去实现.首先,我们可以通过