在很多的网络开发中,经常会碰到一些内存转换,如下面的场景:
#define PACKAGE_PARSE_ERROR -1 #define PACKAGE_PARSE_OK 0 int parse_package( int* a, int* b, int* c, int* d, char* buf, int buf_len ) { if( !buf || buf_len < 16 ){ return PACKAGE_PARSE_ERROR; } memcpy( a, buf, 4 ); memcpy( b, buf + 4, 4 ); memcpy( c, buf + 8, 4 ); memcpy( d, buf + 12, 4 ); return PACKAGE_PARSE_OK; }
这是网络解包的过程中的一个调用,封包的过程则是逆过程。
像这样的应用其实完 全可以用整型强制转换来代替,而且效率会至少提高一倍。
为了说明问题,我们举个简单的例 子:
#include <stdio.h> #include <stdlib.h> #include <memory.h> int main() { int s; char buffer[4]; memcpy(&s, buffer, 4 ); s = *(int*)(buffer); return 0; }
第10行和第11行的效果是一样的,10行采用的是内存复制,11行采用的是强制转换,为了方 便比较,我们看一下汇编代码:
pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp leaq -16(%rbp), %rcx leaq -4(%rbp), %rax movl $4, %edx movq %rcx, %rsi movq %rax, %rdi call memcpy leaq -16(%rbp), %rax movl (%rax), %eax movl %eax, -4(%rbp) movl $0, %eax leave
代码中可以看出,内存复制方法占用了7-12行,共6行,强制转换占用了13-15行,共3 行,指令上少了一半。
深究一下其实还不止,因为第12行其实是一个函数调用,必然会有栈的 迁移,所以强制转换的效率比内存复制起码高一倍。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, int
, include
, memcpy memmove
, memcpy
, memcpy s
, 强制
, 过程
memcpy()
mqtt高并发消息服务器、1000并发 服务器配置、服务器并发测试、高并发服务器架构、服务器并发量,以便于您获取更多的相关知识。