-
Notifications
You must be signed in to change notification settings - Fork 385
ipc::buffer
mutouyun edited this page Dec 9, 2025
·
1 revision
数据缓冲区对象,用于IPC通讯中的数据传输。自动管理内存生命周期,提供了安全高效的数据封装。
class IPC_EXPORT buffer {
public:
using destructor_t = void (*)(void*, std::size_t);
buffer();
buffer(void* p, std::size_t s, destructor_t d);
buffer(void* p, std::size_t s, destructor_t d, void* mem_to_free);
buffer(void* p, std::size_t s);
template <std::size_t N>
explicit buffer(byte_t (& data)[N]);
explicit buffer(char & c);
buffer(buffer&& rhs);
~buffer();
void swap(buffer& rhs);
buffer& operator=(buffer rhs);
bool empty() const noexcept;
void * data() noexcept;
void const * data() const noexcept;
template <typename T>
T get() const;
std::size_t size() const noexcept;
std::tuple<void*, std::size_t> to_tuple();
std::tuple<void const *, std::size_t> to_tuple() const;
std::vector<byte_t> to_vector() const;
friend bool operator==(buffer const & b1, buffer const & b2);
friend bool operator!=(buffer const & b1, buffer const & b2);
};| 成员 | 说明 |
|---|---|
destructor_t |
析构函数类型定义 |
buffer |
构造函数 |
~buffer |
析构函数 |
swap |
交换两个buffer的内容 |
operator= |
移动赋值操作 |
empty |
判断buffer是否为空 |
data |
获取数据指针 |
get |
获取指定类型的数据指针 |
size |
获取数据大小 |
to_tuple |
转换为tuple |
to_vector |
转换为vector |
operator==, operator!= |
比较操作符 |
using destructor_t = void (*)(void*, std::size_t);析构函数类型定义。当buffer对象销毁时,会调用此函数释放内存。
| 参数 | 说明 |
|---|---|
void* |
指向需要释放的内存地址 |
std::size_t |
内存大小 |
/*A*/ buffer();
/*B*/ buffer(void* p, std::size_t s, destructor_t d);
/*C*/ buffer(void* p, std::size_t s, destructor_t d, void* mem_to_free);
/*D*/ buffer(void* p, std::size_t s);
/*E*/ template <std::size_t N>
explicit buffer(byte_t (& data)[N]);
/*F*/ explicit buffer(char & c);
/*G*/ buffer(buffer&& rhs);构造函数。
- A. 默认构造函数,创建一个空buffer
- B. 带析构函数的构造函数,指定数据指针、大小和析构函数
- C. 带独立释放地址的构造函数,用于数据指针是某个大块内存的一部分时
- D. 简单构造函数,指定数据指针和大小(不提供析构函数)
- E. 从字节数组构造
- F. 从单个字符构造(注意:需要非const引用)
- G. 移动构造函数
| 参数 | 说明 |
|---|---|
p |
void*,数据指针 |
s |
std::size_t,数据大小 |
d |
destructor_t,析构函数,当buffer销毁时调用 |
mem_to_free |
void*,实际需要释放的内存地址(当p是某个大块内存的一部分时使用) |
data |
byte_t (&)[N],字节数组引用 |
c |
char &,字符引用(非const) |
rhs |
buffer&&,另一个buffer对象的右值引用 |
// 默认构造
ipc::buffer buf1;
// 从现有内存构造(不拥有所有权)
char data[100];
ipc::buffer buf2(data, sizeof(data));
// 从动态分配的内存构造(拥有所有权)
char* ptr = new char[100];
ipc::buffer buf3(ptr, 100, [](void* p, std::size_t) { delete[] (char*)p; });
// 从偏移内存构造(指定独立的释放地址)
char* block = new char[100];
char* offset_data = block + 25;
ipc::buffer buf4(offset_data, 50, [](void* p, std::size_t) {
delete[] (char*)p;
}, block); // 释放block而不是offset_data
// 从字节数组构造
byte_t arr[64];
ipc::buffer buf5(arr);
// 移动构造
ipc::buffer buf6(std::move(buf3));~buffer();析构函数。销毁buffer对象,如果设置了析构函数,会自动调用它来释放内存。
void swap(buffer& rhs);交换两个buffer的内容。
| 参数 | 说明 |
|---|---|
rhs |
buffer&,另一个buffer对象的引用 |
buffer& operator=(buffer rhs);移动赋值操作。仅支持移动赋值,不支持拷贝赋值。
| 参数 | 说明 |
|---|---|
rhs |
buffer,另一个buffer对象(copy-and-swap惯用法) |
ipc::buffer buf1(ptr1, size1, destructor);
ipc::buffer buf2;
buf2 = std::move(buf1); // 移动赋值bool empty() const noexcept;判断buffer是否为空。
| 返回值 | 说明 |
|---|---|
true |
buffer为空(size为0或data为nullptr) |
false |
buffer非空 |
/*A*/ void * data() noexcept;
/*B*/ void const * data() const noexcept;获取buffer的数据指针。
- A. 非const版本,返回可修改的指针
- B. const版本,返回只读指针
| 返回值 | 说明 |
|---|---|
void* / void const *
|
指向buffer数据的指针 |
template <typename T>
T get() const;获取指定类型的数据指针。这是一个模板方法,可以将内部指针转换为任意类型。
| 模板参数 | 说明 |
|---|---|
T |
目标类型(通常是指针类型) |
| 返回值 | 说明 |
|---|---|
T |
转换后的数据指针 |
ipc::buffer buf = receive_data();
char* str = buf.get<char*>();
int* num = buf.get<int*>();std::size_t size() const noexcept;获取buffer的数据大小。
| 返回值 | 说明 |
|---|---|
std::size_t |
数据大小(字节数) |
/*A*/ std::tuple<void*, std::size_t> to_tuple();
/*B*/ std::tuple<void const *, std::size_t> to_tuple() const;将buffer转换为tuple,包含数据指针和大小。
- A. 非const版本,返回可修改的指针
- B. const版本,返回只读指针
| 返回值 | 说明 |
|---|---|
std::tuple<void*, std::size_t> |
包含数据指针和大小的tuple |
ipc::buffer buf(data, 100);
auto [ptr, sz] = buf.to_tuple(); // C++17
// C++14:
auto tuple = buf.to_tuple();
void* ptr = std::get<0>(tuple);
std::size_t sz = std::get<1>(tuple);std::vector<byte_t> to_vector() const;将buffer的数据复制到vector中。
| 返回值 | 说明 |
|---|---|
std::vector<byte_t> |
包含buffer数据副本的vector |
ipc::buffer buf(data, 100);
std::vector<byte_t> vec = buf.to_vector();friend bool operator==(buffer const & b1, buffer const & b2);
friend bool operator!=(buffer const & b1, buffer const & b2);比较两个buffer是否相等。比较基于数据内容和大小。
| 参数 | 说明 |
|---|---|
b1, b2
|
buffer const &,要比较的两个buffer对象 |
| 返回值 | 说明 |
|---|---|
true / false
|
buffer相等或不相等 |
ipc::buffer buf1(data1, 100);
ipc::buffer buf2(data2, 100);
if (buf1 == buf2) {
// 数据相同
}ipc::route cc { "my-route", ipc::receiver };
ipc::buffer buf = cc.recv();
if (!buf.empty()) {
char* str = buf.get<char*>();
std::cout << "Received: " << str << std::endl;
}ipc::route cc { "my-route" };
std::string message = "Hello, IPC!";
cc.send(message); // 自动转换为buffer// 使用自定义分配器
void* ptr = my_allocator.allocate(1024);
ipc::buffer buf(ptr, 1024, [](void* p, std::size_t sz) {
my_allocator.deallocate(p, sz);
});- buffer是移动语义对象,不支持拷贝
- 从单个字符构造时,必须提供非const引用(避免意外修改常量)
- 使用
mem_to_free参数时,确保它指向实际分配的内存起始地址 - buffer的析构函数会自动调用注册的destructor释放内存
- 空buffer(默认构造)不会调用析构函数