问题提出

我们在解析JSON时,需要多次调用堆栈来解析对象,这时主要产生了两个问题:
1)多次调用需要大量的申请一块类似的内存空间,然后又释放掉,耗费时间。如果当前系统中有大量的内存碎片,并且我们申请的空间很大,甚至有可能失败。
2)压栈对象的类型不一,而在c++中定义的模板类std::stack中,却只能存储一种类型。

对此我们需要一个可以存放任意类型的混合堆栈,并且可以通过重复使用一块我们提前准备好的内存避免问题 1)。

解决办法

  1. placement new(定位放置new)
    它与普通的new不同,一般申请空间语句为:A* p=new A;而placement new则为:A* p=new (ptr)A;(ptr为指定的内存首地址)。
    顾名思义,定位放置即在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。
    placement new在已分配好的内存上进行对象的构建,速度大大提升;
    同时已分配好的内存可以反复利用,有效的避免了内存碎片问题。
    一般new和delete成对出现,然而placement new其实是相当于在一块已经分配好的内存上通过调用构造函数进行操作,所以结束后需要调用析构函数并释放内存。

  2. 混合类型堆栈
    我们通过定义以下来实现:

class Stack {Stack(Allocator* allocator, size_t stackCapacity);~Stack();void Clear();void ShrinkToFit();template<typename T> T* Push(size_t count = 1);template<typename T> T* Pop(size_t count);template<typename T> T* Top();template<typename T> T* Bottom();Allocator& GetAllocator();bool Empty() const;size_t GetSize();size_t GetCapacity();
};

此时我们可以使用模板成员函数,压入或弹出不同类型的对象。而且为了完全防止拷贝构造函数调用的可能性,这些函数都是返回指针。

同时这也带来的新的问题:不同的数据类型带来的对齐问题。
对此我们可以使用:std::memcpy来解决:

int i = 123;
std::memcpy(s.Push<int>(), &i, sizeof(i));int j;
std::memcpy(&j, s.Pop<int>(1), sizeof(j));

混合类型堆栈同时也可以当做一个动态缩放的缓冲区来使用,如:从DOM生成JSON的字符串便可以借助它来实现。

JSON学习笔记-混合任意类型的堆栈相关推荐

  1. Go圣经-学习笔记之复合类型(二)

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇 Go圣经-学习笔记之复合类型 下一篇 Go圣经-学习笔记之复合数据结构(三) map介绍和简单使用 map是一种无序的 ...

  2. WebGL three.js学习笔记 6种类型的纹理介绍及应用

    WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...

  3. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  4. [读书笔记]C#学习笔记三: C#类型详解..

    前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...

  5. Qt学习笔记之 字符串类型小结

    1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...

  6. 学习TypeScrip2(任意类型)

    Any 类型 和 unknown 顶级类型 nodejs 环境执行ts npm i @types/node --save-dev (node环境支持的依赖必装) npm i ts-node --g 1 ...

  7. TS学习笔记 TS基本类型

    基本类型 类型声明 类型声明是TS非常重要的一个特点 通过类型声明可以指定TS中变量(参数.形参)的类型 指定类型后,当为变量赋值时,TS编辑器会自动检查是否符合类型声明,符合则赋值,否则报错 指定类 ...

  8. JavaScript学习笔记之 数组方法一 堆栈 和队列

    数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ...

  9. JSON学习笔记-处理空白字符(使用 SSE4.2 优化字符串扫描)

    背景:一些JSON含有大量的空白字符(whitspace),在解析JSON时需要跳过这些空白字符. 那么如果我们只是简单的进行处理,当遇在输入流中到这四种空白字符( ,\t,\n,\r,)时,直接跳过 ...

最新文章

  1. JavaScript面向对象怎样删除标签页?
  2. Linker加载so失败问题分析
  3. XPath 使用那些事
  4. Flowable节点跳转
  5. Mysql分组查询group by语句详解
  6. python玩转android_如何用python玩跳一跳 ?(安卓版)
  7. 数据结构之最小生成树
  8. SpringBoot入门二
  9. android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息
  10. 90万餐饮商家全店五折 支付宝首次以数字生活平台身份参加双11
  11. octave与matlab语法,Octave与Matlab
  12. 微软MVP总结的Windows XP优化大全
  13. 多元统计分析(笔记更新中...)
  14. 最新python腾讯文档界面自动打卡
  15. 手机管家中的黑名单功能
  16. 可视化网络监控软件OpManager获选″IT运维产品之星”
  17. Python初级入门精讲-王大鹏-专题视频课程
  18. 鸿蒙系统是怎样一种系统,鸿蒙系统pc版怎么安装 鸿蒙系统pc版安装教程
  19. spring的事务依赖
  20. 【TOJ 3755】 Graph and Queries【Splay】

热门文章

  1. c++ string头文件详解
  2. 求子集PHP,汉诺塔问题与求子集
  3. JNI 调用崩溃问题分析
  4. java的单步调试_java存储过程单步调试详解
  5. 中本聪与拜占庭将军问题
  6. 基于高频词抽样+负采样的CBOW模型
  7. SpringBoot实现景区票务系统
  8. markdown笔记
  9. pandas 中 dropna()函数
  10. FAST特征点检测的matlab实现