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++知识库 -> 搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(七) -> 正文阅读

[C++知识库]搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(七)

2021SC@SDUSC

目录

一.前置知识点

1.malloc()函数:动态分配内存空间

二.关键代码分析


一.前置知识点

1.malloc()函数:动态分配内存空间

malloc()函数是在stdlib.h库里的一个函数。malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

如果希望在分配内存的同时进行初始化,可以使用?calloc()?函数的~

malloc()函数的返回值是:分配成功返回指向该内存的地址,失败则返回 NULL。

malloc()函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。

二.关键代码分析

int TutorialMessage::set_message_body(const void *body, size_t size)

{

void *p = malloc(size);

if (!p)

return -1;

memcpy(p, body, size);

free(this->body);

this->body = (char *)p;

this->body_size = size;

this->head_received = 4;

this->body_received = size;

return 0;

}

//1.memcpy函数使得body中的size个字节复制给p;

2.释放掉this指向body之前的值,从现在开始,this指向body的值是(char *)p,大小为size;this指向head_received的值为4,指向body_received的值为size。

TutorialMessage::TutorialMessage(TutorialMessage&& msg)

{

//msg是一个字符串

*(ProtocolMessage *)this = std::move(msg);

memcpy(this->head, msg.head, 4);

this->head_received = msg.head_received;

this->body = msg.body;

this->body_received = msg.body_received;

this->body_size = msg.body_size;

msg.head_received = 0;

msg.body = NULL;

msg.body_size = 0;

}

//1.memcpy函数使得msg.head中的4字节长度的值复制给this->head。首先先保证读取4字节的head完整,再读取body。因此是先使 msg.head_received的值赋给this->head_received;再使 msg.body的值赋给this->body。

读取完成后使msg.head_received,msg.body_size归零,msg.body为空。

TutorialMessage& TutorialMessage::operator = (TutorialMessage&& msg)

{

if (&msg != this)

{

this->size_limit = msg.size_limit;

msg.size_limit = (size_t)-1;

memcpy(this->head, msg.head, 4);

this->head_received = msg.head_received;

this->body = msg.body;

this->body_received = msg.body_received;

this->body_size = msg.body_size;

msg.head_received = 0;

msg.body = NULL;

msg.body_size = 0;

}

return *this;

}

//如果this不指向msg的地址,那就使this->size_limit指向msg.size_limit后,msg.size_limit减少一位,重复TutorialMessage::TutorialMessage(TutorialMessage&& msg)中的实现。

}

---------------------------------------------------------------------------------------------------------------------------------

参考资料:

tutorial/tutorial-10-user_defined_protocol/message.cc · 搜狗开源/workflow - Gitee.com

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:39:12  更:2021-11-16 18:40:54 
 
开发: 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年11日历 -2024/11/24 6:41:29-

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