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

搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(七),第1张

搜狗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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5503132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存