yaLanTingLibs
struct_pack::trivial_view< T > 模板结构体 参考

trivial_view<T> 是一个平凡结构体的视图,在类型系统上等价于T更多...

#include <struct_pack_doc.hpp>

Public 类型

using value_type = T
 trivial_view指向的对象的类型,value_type必须是一个平凡的结构体
 

Public 成员函数

 trivial_view (const T *t)
 构造一个指向对象ttrivial_view 更多...
 
 trivial_view (const T &t)
 构造一个指向对象ttrivial_view 更多...
 
 trivial_view (const trivial_view &)=default
 
 trivial_view ()
 构造一个指向空对象的trivial_view
 
trivial_viewoperator= (const trivial_view &)=default
 
void set (const T &obj)
 设置trivial_view指向的对象 更多...
 
const T & get () const
 返回trivial_view指向的对象T的常引用 更多...
 
const T * operator-> () const
 允许trivial_view通过运算符->访问指向对象T 更多...
 

详细描述

template<typename T>
struct struct_pack::trivial_view< T >

trivial_view<T> 是一个平凡结构体的视图,在类型系统上等价于T

其作用是减少赋值/反序列化过程中的内存拷贝。 例如,假如有一个巨大的结构体Data

struct Data {
int x[10000],y[10000],z[10000];
};

假设有协议:

struct Proto {
std::string name;
Data data;
};
void serialzie(std::string_view name, Data& data) {
Proto proto={.name = name, .data = data};
//从已有的数据构造对象时,需要花费大量时间拷贝
auto buffer = struct_pack::serialize(proto);
auto result = struct_pack::deserialize<Proto>(data);
//反序列化时,需要花费大量时间拷贝
assert(result->name == name && result->data == data);
}
Buffer serialize(const Args &...args)
序列化对象并返回结果

可以发现,构造/反序列化时拷贝代价很大。 如何解决?我们可以改用视图:

struct ProtoView {
std::string_view name;
};
void serialzie(std::string_view name, Data& data) {
ProtoView proto={.name = name, .data = data};
//从已有的数据构造对象时,可以做到zero-copy
auto buffer = struct_pack::serialize(proto);
auto result = struct_pack::deserialize<ProtoView>(data);
//反序列化是zero-copy的。
assert(result->name == name && result->data.get() == data);
}
trivial_view<T> 是一个平凡结构体的视图,在类型系统上等价于T。
Definition: struct_pack_doc.hpp:108

trivial_view<T>在类型系统中等价于T,因此,序列化其中一者再反序列化到另外一者是合法的。

void serialzie(Proto& proto) {
auto buffer = struct_pack::serialize(proto);
auto result = struct_pack::deserialize<ProtoView>(data);
//反序列化是zero-copy的。
assert(result->name == name && result->data.get() == data);
}
模板参数
Ttrivial_view指向的类型,T必须是一个平凡的结构体

构造及析构函数说明

◆ trivial_view() [1/2]

template<typename T >
struct_pack::trivial_view< T >::trivial_view ( const T *  t)

构造一个指向对象ttrivial_view

参数
t

◆ trivial_view() [2/2]

template<typename T >
struct_pack::trivial_view< T >::trivial_view ( const T &  t)

构造一个指向对象ttrivial_view

参数
t

成员函数说明

◆ get()

template<typename T >
const T& struct_pack::trivial_view< T >::get ( ) const

返回trivial_view指向的对象T的常引用

返回
const T&

◆ operator->()

template<typename T >
const T* struct_pack::trivial_view< T >::operator-> ( ) const

允许trivial_view通过运算符->访问指向对象T

返回
const T*

◆ set()

template<typename T >
void struct_pack::trivial_view< T >::set ( const T &  obj)

设置trivial_view指向的对象

参数
obj

该结构体的文档由以下文件生成: