C++_字节流到结构体-memcpy _shared_ptr

智能指针

C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared_ptr 模板类,用来管理指针的存储,提供有限的内存回收函数,可同时与其他对象共享该管理功能
std::unique_ptr ,它保证了所指向的对象只有一个拥有者。
     get():返回指向对象的原始指针,如果需要的话,可以使用此原始指针访问对象。
     release():释放所有权,返回指向对象的原始指针,并将std::unique_ptr置为空。
     reset():释放当前拥有的对象,并可以选择性地采用新的对象。
     operator bool():检查std::unique_ptr是否为空。
     operator*() 和 operator->:提供对对象的访问。
std::shared_ptr ,它允许多个指针指向同一个对象,并在无任何拥有者时自动删除对象。
   .get()
   void swap (shared_ptr& x) noexcept

场景

在程序中将远程传来的字节流进行结构化,或者将结构化的数据变成字节流传给远程主机。	

函数功能

01. std::memcpy  定义于头文件 <cstring>
   void* memcpy( void* dest, const void* src, std::size_t count );
   
     从 src 所指向的对象复制 count 个字符到 dest 所指向的对象。两个对象都被转译成 unsigned char 的数组	   
      src指向复制来源对象的指针               dest 指向要复制的对象的指针
  is_trivially_copyable  (C++11)  检查类型是否可平凡复制	

02. c_str()就是将C++的string转化为C的字符串数组
    C中没有string,所以函数c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址	
 使用strcpy()函数 等来操作方法c_str()返回的指针 
   // c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
    strcpy(c,s.c_str());	
	
03.std::shared_ptr提供了一个名为.get()的成员函数,该函数用于获取指向对象的原始指针。
   调用.get()时,它返回指向由std::shared_ptr管理的对象的原始指针
   
04. void*中的void代表一个任意的数据类型,"星号"代表一个指针,所以其就是一个任意数据类型的指针 
  当void*作为函数的参数类型或者返回值类型时,说明该函数可以接收或者返回任意类型的指针	
    void表示无值,在指针前,则说明该指针指向不确定,因此该指针可以指向任意类型的变量,
	         但如果直接输出指向内容,会报错,需要在输出时将其进行显示类型转换
    void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”
	
05.  memcpy((void *)&abstruct,(void *)RxBuffer,4);
     std::shared_ptr<Type> info = std::make_shared<Type>()
	 bytestring ="bytesting";
     memcpy((void *)&info.get(),(void *)bytestring.c_str(),4);


06.数据类型转换
 隐式类型转换和显式类型转换 
    (void *)  (char *)  const_cast<char *>()
  隐式类型
	隐式类型转换由编译器自动完成 
 显式类型转换
    C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换。
	  const_cast dynamic_cast static_cast reinterpret_cast		   
	1.const_cast : 运算符用于修改类型的 const / volatile 属性。
	     除了 const 或 volatile 属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的 const 属性,可以加上 const 属性,也可以去掉 const 属性
  	      const_cast() 将常量变量转换为可赋值的变量,但注意,原来的常量名称的值不会被改变。因为在预编译阶段,将常量转换为真实数字,就如同宏定义的常量一样
	2. dynamic_cast: 在运行时执行转换,验证转换的有效性。如果转换未执行,则转换失败,表达式则被判定为 null
    3. static_cast :进行普通数据类型转换,用于两个相关类型之间的转换
    4. reinterpret_cat
      可以将一个指针类型转换为另一个指针类型,即使转换前后的数据类型不同。
	    它不检查指针类型和指针所指向的数据是否相同。它的字面意思是“重新诠释”

内容

结构体成员对齐
大于8位数据类型的大小端存储方式	  
    1)结构体的起始地址能被n整除 (2)结构体的总大小能被n整除 当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除
       memcpy((void *)&abstruct,(void *)RxBuffer,4);
	 固定字节数
       c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址

说明

 在C/C++程序中,结构化数据通常用结构体来组织,结构体也能够方便的转换为字节流,因此结构化的数据传输本不该成为问题,
 但在VC或GCC的默认设置下编译出的程序,却有一个值得注意的问题——结构体的对齐。    
 结构体的对齐是编译器为加快程序运行,在结构体中填入一些空白字节,是的结构体成员按一定规则对齐。

排查故障

 Segmentation Fault"(段错误)。Segmentation Fault是指当程序访问了未经允许的内存区域时发生的错误
debug: 
  gbd  b r  n  p

数据集合

containers
    map返回key值对应的value值,有2种方法:可以利用 find(key)->second来获取;  直接利用 map[key] 来获取;

共享内存

 shm 共享内存(Shared Memory)是一种进程间通信(IPC,Inter-Process Communication)的方式
CyberRT 数据用共享内存发布时,首先会创建 ShmTransmitter 对象,
      包含两个主要成员segment和notifier,
	    Segment用于创建共享内存(上面绿色部分),
		Notifer 最终构建ReadableInfo通知给其他进程。
           使用哪个ConditionNotifier-> notify或MulticastNotifier->notify,是在创建时根据配置文件决定的

参考

 memcpy并发场景下、srclen < dstlen出现的问题 https://blog.csdn.net/John_ToStr/article/details/130081173	
 https://blog.csdn.net/yt_42370304/article/details/134562798
  C++ 11 智能指针——shared_ptr类成员函数详解 https://www.cnblogs.com/JCpeng/p/15031742.html	 
posted @ 2024-05-10 20:01  辰令  阅读(117)  评论(0编辑  收藏  举报