IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 手把手教你实现buffer(一) —— C++中buffer的概念及需求 -> 正文阅读

[C++知识库]手把手教你实现buffer(一) —— C++中buffer的概念及需求

写在前面

buffer的概念很庞大,根据不同场景,有各种各样功能的buffer,比如双缓冲buffer,jitterbuffer。这篇文章说的buffer,是指一段用于存取数据的内存空间,这是最基础的buffer。然而就是这种最基础的buffer,在C++中标准库也没有提供很通用,完善的buffer类(-_-!)。

这一系列文章,将参照webrtc中的CopyOnWriteBuffer,一步步介绍如何实现这样的buffer。

buffer的实现

静态分配

在我们平常的开发中,当需要一个buffer时,最简单的方式就时直接定义个数组,如下代码:

//128字节的数组
uint8_t buffer[128]

这种方式叫静态数组,空间分配在栈上,产生了一个固定128字节长度的buffer。长度值是预估,并不是根据程序运行时分配空间,而是编译器就确定了,所以会造成空间浪费。

动态分配

通过newmalloc动态分配一个buffer,这种方式的好处在程序运行时分配,不会造成空间浪费,坏处也很明显,就是需要手动管理buffer,不小心就会造成内存泄露。

通过智能指针管理buffer

到了C++11,有了unique_ptr后,可以用它来代替裸指针管理动态分配的内存,达到自动释放内存的目的

//在超出作用域时,会自动释放
std::unique_ptr <uint8_t[]> buffer(new uint8_t[128]);

但是这种buffer还是太原始(本质就是通过指针管理buffer):

  1. 容量固定,虽然是动态分配,但是再扩容就比较麻烦
  2. 缺少必要的接口,比如判断是buffer否为空,获取buffer中的数据长度等

vector代替指针

标准库中的vector可以作为buffer使用,它可以自动管理内存,自动扩容,提供了必要接口。

#include <vector>
#include <iostream>
int main() {
    std::vector<uint8_t> buffer;
    //代表一段数据
    uint8_t data1[3] = {1,2,3};
    buffer.assign(data1,data1+3);
    std::cout<<"size:"<<buffer.size()<<",capacity:"<<buffer.capacity()<<std::endl;
    //代表另外一段数据
    uint8_t data2[5] = {1,2,3,4,5};
    //会自动扩容
    buffer.assign(data2,data2+5);
    std::cout<<"size:"<<buffer.size()<<",capacity:"<<buffer.capacity()<<std::endl;
    
    for (auto i:buffer) {
        std::cout<<(uint32_t)i<<" ";
    }
}

上面的代码中在将data2放入buffer时,buffer会自动扩容。vector也提供了size()capaciy()等基本接口。通过vectordata()方法可以获取内部buffer的指针。

vector作为buffer使用的局限

vector满足了作为一个buffer的大部分要求,但是它的接口还是有局限,比如vector没提供添加一段数据方法,尽管有assgin方法,但它是往vector中copy一段数据,而非添加。

实现自己的buffer

上面描述了buffer的需求,概括起来有如下几点:

  1. 内存动态分配
  2. 自动管理内存
  3. 自动扩容
  4. 提供使用方便的接口

vector满足了前三个需求。但是第4个最重要,毕竟简单,好用是最核心的需求。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:25:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 13:57:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码