C 缓冲疼痛
C++ Buffer pains
我需要一个存储几个字段(包括缓冲区)的类(在C 11中)。我从构造函数中的malloc()
开始,在destuructor中使用free()
(我一段时间没有触摸C/C ,所以这就是我所记得的)。
我记得的下一件事(由于崩溃),我需要实现复制构造函数和一个分配运算符。现在,我只为一个带有3个字段的课程(其中一个是缓冲区)的全屏代码。
一个问题。
我应该使用什么?(我对选择的数量使我眼花azz乱-std::vector
,std::array
,std::shared_ptr
,boost::scoped_ptr
,可能是其他选择)。
我正在寻找的此缓冲区的功能是:
- 尽可能少的内存管理
- 摆脱这些复制构造函数和作业操作员
- 能够用作void*的能力(我必须将其传递给接受" void*"的函数)
- 能够随机访问/写入它(我可能需要从中获取一个随机范围并为其编写一个随机范围)
- 将其分配在堆上(缓冲区可能很大)
- 最好使用某些标准设施
您应该只使用std::vector<unsigned char>
作为缓冲区。这已经具有所有必要的构造函数,操作员和驱动器,因此除了使用它之外,没有什么特别的。
我不是C 专家,所以我欢迎对此解决方案提出任何批评,但是明智的指针可能会起作用。
#include <iostream>
#include <memory>
void do_something(void *buffer)
{
char* char_buffer = (char*)buffer;
std::cout << char_buffer[0] << std::endl;
}
int main()
{
size_t size = 10;
// reference counted pointer to auto-delete the buffer
std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>());
// use the underlying pointer
// http://stackoverflow.com/questions/27819809/why-is-there-no-operator-for-stdshared-ptr
buffer.get()[0] = 'a';
do_something(buffer.get());
// buffer deallocated at the end of scope
}
- 尽可能少的内存管理
智能指针为您照顾
- 摆脱这些复制构造函数和作业操作员
我认为聪明的指针可以处理
- 能够用作void*的能力(我必须将其传递给接受" void*"的函数)
使用 .get()
和cast。
- 能够随机访问/写入它(我可能需要从中获取一个随机范围并为其编写一个随机范围)
这仍然是一个指针,所以我看不出为什么它不起作用(我没有尝试过)。
- 将其分配在堆上(缓冲区可能很大)
它在堆上
- 最好使用某些标准设施
<memory>
另外,结帐<vector>
的.data()
功能,该功能返回指针到向量的基础数组。
我认为您需要某种内存缓冲区。检查此简单的C 缓冲区类。由于我的公司开发环境,不使用C 11是故意的。
https://github.com/jeremyko/cumbuffer
相关文章:
- 如何使用原子指针执行双缓冲
- 消费者和生产者问题的双重缓冲
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 我似乎无法修改帧缓冲
- 如何在C++中写入 1000 个文件时有效地缓冲
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 我是否使用双缓冲?
- OpenGL:使用实例化绘图与我正在绘制的帧缓冲进行绘制
- 如何强制文件描述符缓冲我的输出
- Qt双缓冲行为
- 如何在没有缓冲的情况下使用 parquet-cpp 写入面向流/行的数据?
- MySQL 事务和缓冲的请求列表
- 使用 std::stringbuf 进行缓冲的效果,同时通过插入运算符'<<'执行写入
- Qt 帧缓冲对象甚至不渲染顶点
- MySQL连接器C 结果集被缓冲
- w/ w/结构带char缓冲液的静态初始化[]
- 在 Linux 中禁用 USB 大容量存储设备的读取缓冲
- 是否有一种缓冲方法进行同步
- 双缓冲的waveoutwrite()像地狱一样口吃
- C 缓冲疼痛