记一次面试中的相关问题

news2025/3/14 10:34:43

1. protobuf内部的实现原理

序列化与反序列化,比如对于数字它要求根据数字的大小选择存储空间,小于15的数字只用1个字节来表示,大于15的数用2个字节来表示,以此类推,这样要求可以尽可能地节省空间。Protobuf的一大特点是编码后的数据量很小,可以节省网络带宽。

还有一种说法是,JSON和MessagePack都使用字符串Key键值作为映射到程序变量的连接桥梁,用变量字符串去查看对应的Key键值是否存在,这样免不了因Key键值字符串太多而消耗更多空间。Protobuf则用数字编号来作为Key键值与变量映射的连接桥梁,每个变量都必须有一个不重复的标签号(即数字编号),使用Protobuf结构中变量字段后跟着的数字编号来映射数据中的数字编号,进而读取数据。Protobuf为每个结构变量都定义了一个标签号(即数字编号),这个数字编号就代表程序变量与指定编号数据的映射关系。

2. 实现函数 

void memcpy(void* dest, const void* source, size_t count);

参数说明:

void *dest:指向某一缓冲区,该缓冲区用来存放要拷贝的数据(即目标缓冲区)

const void *source:指向某一缓冲区,该缓冲区用来存放要拷贝给他人的数据(即源缓冲区)

size_t count:要拷贝多少个字节

功能说明:

此函数可将source缓冲区中前count个字节的数据拷贝到dest缓冲区中。请注意,当dest缓冲区和source缓冲区中有部分重叠的情形发生时,用户应使用memmove函数来进行数据的拷贝,因为这种情况下,memcpy并不能保证其结果是正确的。

返回值:

NULL。

实例代码:

#include <stdio.h>
#include <string.h>

#include <iostream>
#include <string>

using namespace std;

void memcpy(void* psrc, void* pdst, size_t length) {
  if (psrc == NULL || pdst == NULL) return;
  void* ret = psrc;
  if (pdst <= psrc || (char*)pdst >= (char*)psrc + length) {
    // 没有内存重叠,从低地址开始复制
    while (length--) {
      *(char*)pdst = *(char*)psrc;
      pdst = (char*)pdst + 1;
      psrc = (char*)psrc + 1;
    }
  } else {
    // 有内存重叠,从高地址开始复制
    psrc = (char*)psrc + length - 1;
    pdst = (char*)pdst + length - 1;
    while (length--) {
      *(char*)pdst = *(char*)psrc;
      pdst = (char*)pdst - 1;
      psrc = (char*)psrc - 1;
    }
  }
  return;
}

int main() {
  char* src[10] = {"C BIBLE"};
  char* dst[10] = {"C Bible"};

  cout << "Before memcpy..." << endl;
  cout << "src = " << *src << endl;
  cout << "dst = " << *dst << endl;

  memcpy(src, dst, 10);

  cout << "After memcpy..." << endl;
  cout << "src = " << *src << endl;
  cout << "dst = " << *dst << endl;

  return 0;
}

输出:

Before memcpy...
src = C BIBLE
dst = C Bible
After memcpy...
src = C BIBLE
dst = C BIBLE

关于内存重叠问题:

起初我不太明白,为什么两块分配好的内存空间,会有重叠的问题?后来了解到这种内存重叠在平时写的应用级代码中并不会出现,但是在内核和驱动代码中会存在内存重叠问题。

 图中灰色的部分即为内存重叠的部分,dst内存开始的地址在src所分配的内存中(这在应用层面的代码中是不可能出现的)。解决该问题的办法就是将代码从高地址向低地址进行复制。(复制完之后那原来的数据岂不就没办法使用了?这不是copy,将其改为move会更好些)

3. 大端存储和小端存储

大端存储:把字(4字节)的低位放在高地址位

小端存储:把字(4字节)的低位放在低地址位

采用大端模式进行存放有利于人类的思维模式,而采用小端模式更利于计算机处理。

互联网使用的网络字节序采用大端模式进行编址,而主机字节序根据处理器的不同而不同。socket编程时,可以使用系统提供的函数对大小端字节序进行转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python教程:如何建立一个空列表

Python教程&#xff1a;如何建立一个空列表 Python是一种广泛应用于科学计算、数据分析、机器学习等领域的高级编程语言。在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;可以用来存储许多不同类型的数据。在本文中&#xff0c;我们将介绍如何在Python中建立…

OJ Primed Subsequence

原题链接&#xff1a;传送锚点 1.题目 Description Given a sequence of positive integers of length n, we define a primed subsequence as a consecutive subsequence of length at least two that sums to a prime number greater than or equal to two. For ex…

【嵌入式IMAGE 3】opencv的搭建

1. OpenCV源代码下载地址 https://opencv.org/releases/ 2. 在windows平台编译&#xff08;mingw版本&#xff09; 2.1 下载cmake https://cmake.org/files/ 2.2 配置编译器环境变量 2.3 打开cmake-gui.exe a.Use default native compilers 使用默认的本机编译器 b.Specify n…

MyBatis(全)

文章目录 什么是MyBatis?MyBatis快速入门查询user表中所有数据 Mapper代理开发使用Mapper代理方式完成入门案例 MyBatis核心配置文件配置文件完成增删改查案例&#xff1a;完成品牌数据的增删改查操作准备环境查询-查询所有数据查询-查看详情查询-条件查询--1.多条件查询方法1…

css移动端

目录 谷歌模拟器 屏幕分辨率 视口 二倍图 适配方案 rem 简介 问题 媒体查询 移动端 设备宽度不同&#xff0c;HTML标签字号设置多少合适 flexible.js rem-移动端适配 less 注释 运算 嵌套 变量 导入 导出 禁止导出 谷歌模拟器 模拟移动设备&#xff0c;方…

MySQL Community Server的安装配置教程(Windows版本)

&#xff08;1&#xff09;了解MySQL Community Server&#xff1a; MySQL Community Server是开源的MySQL数据库服务的名称。它是MySQL AB在2000年推出的一个开源数据库服务器&#xff0c;现在由Oracle公司维护和管理。 MySQL Community Server是一个关系型数据库系统&#…

通讯录管理系统(cpp)

一 系统需求 主要用C来实现一个通讯录管理系统 需要包含以下功能 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括姓名、性别、年龄、联系电话、家庭住址&#xff0c;最多记录1000人显示联系人&#xff1a;显示通讯录中所有联系人信息删除联系人&#xff1a;按…

【Spring】— 动态SQL :MyBatis的关联映射

目录 MyBatis的关联映射1、关联关系概述2、MyBatis中的关联关系2.1 一对一2.2 一对多2.3 多对多 MyBatis的关联映射 在实际应用中&#xff0c;对数据库的操作会涉及多张表&#xff0c;这在面向对象中就涉及对象与对象之间的关联关系。针对多表之间的操作&#xff0c;MyBatis提…

全志V3S嵌入式驱动开发(wifi驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 荔枝派上面除了支持v3s自带的有线网口&#xff0c;还带有一个支持sd协议的esp 8089 wifi模块。有了这个模块&#xff0c;v3s没有网线&#xff0c;也…

chatgpt赋能python:Python程序与SEO:如何建立程序使您的网站优化更好

Python程序与SEO&#xff1a;如何建立程序使您的网站优化更好 今天&#xff0c;越来越多的网站和在线业务转向搜索引擎优化&#xff0c;以吸引更多访问者和客户。Python编程语言是一种快速、灵活、易于学习的工具&#xff0c;如果正确使用它可以使您的网站SEO更好。下面我们来…

【从删库到跑路】MySQL系列——数据库的介绍MySQL的启动

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;什么是数据库⭐组成⭐数据库的优势 &#x1f35…

Spring Security--自动登录

也就是remember me 在配置链上加一个 然后发送请求时加上:remember-me字段 value值可以为&#xff0c;ture&#xff0c;1&#xff0c;on 我们记住登录后&#xff0c;关掉浏览器再打开&#xff0c;访问一下接口&#xff0c;可以访问&#xff0c;说明记住登录成功了。 因为有的…

Spring中Bean的生命 周期与作用域

文章目录 前言Bean的作用域概念Bean作用域类型1. singleton&#xff1a;单例作⽤域2. prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09;3. request&#xff1a;请求作⽤域4. session&#xff1a;回话作⽤域5. application&#xff1a;全局作⽤域6. websocke…

51单片机实训项目之“红外控制小风扇”代码详解

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说&#xff0c;直接上代码。 另外补充一点红外通信的原理&#xff1a; 红外接收 NEC协议&#xff1a; 数据格式 发射端的方波图&#xff0c;接收端的正好与之相反&#xff0c;数据传输从最低位开始 NEC 标准下…

mqtt.fx连接阿里云物联网平台

这里写目录标题 注册公共示例创建产品添加设备创建云产品流转生成基本信息配置mqtt.fx客户端数据传送 前提条件&#xff1a;下载mqtt.fx软件&#xff0c;以及注册好阿里云物联网平台账号 本实验用两个mqtt.fx客户端接入阿里云物联网平台&#xff0c;来实现不同设备间消息的传输…

大数据Doris(四十):Routine Load基本原理和语法介绍

文章目录 Routine Load基本原理和语法介绍 一、基本原理 二、Routine Load 语法 Routine Load基本原理和语法介绍 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Rou

chatgpt赋能python:如何使用Python获取Listview

如何使用Python获取Listview 在现代数据驱动的世界中&#xff0c;处理大量数据已经成为一项关键技能。准确地说&#xff0c;操作大量数据要比操作一小部分数据要困难得多。Python是一门非常出色的编程语言&#xff0c;它的处理大量数据的能力无人能敌。在这篇文章中&#xff0…

MySQL面试题详解

优化 如何定位慢查询 mysql中慢查询通常发生在以下几种情况&#xff0c;聚合查询&#xff0c;多表查询&#xff0c;表数据量过大查询&#xff0c;深度分页查询。 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长(超过1s) 定位慢查询的方法主要有两种。方法一…

Windows 下编译 OpenCV 和 OpenCV-contrib

文章目录 导言环境准备源码获取环境获取 配置 CMake 并编译ConfigureGenerate 生成项目总结 导言 在本文中&#xff0c;我们将介绍如何在 Windows 系统下编译 OpenCV 和 OpenCV-contrib。OpenCV 是一个开源的计算机视觉库&#xff0c;它包含了许多图像处理和计算机视觉的功能。…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…