当前位置: 首页 > news >正文

C++高频知识点(二十)

文章目录

  • 96. 在C++代码中嵌入C代码,需要怎么做?
  • 97. 进程与线程,分配资源的最小单位是什么?
  • 98. 讲讲 TCP封包和拆包 。
    • 封包和拆包的应用场景
    • 代码示例
  • 99. 谈谈你对网络编程中 epoll的理解
    • 代码示例
  • 100. C++中智能指针的种类有哪些?

96. 在C++代码中嵌入C代码,需要怎么做?

虽然说 C++是C语言的超集,但是他们之间还是有很多差别的, 最主要的是C语言是不支持重载的,还有不是面向对象而是面向过程并且没有虚函数表机制,在编译过程中它对函数名称的组织与C++是不一样的, 因此在C++中引入C语言的函数,需要特别处理。

C 基本不做名称修饰(几乎就是“原名”);C++ 一定做名称修饰,把函数签名里的各种信息编码进符号名。因此 C 不能重载,C++ 可以;跨语言调用时,C++ 需要用 extern “C” 关掉修饰。
在这里插入图片描述

97. 进程与线程,分配资源的最小单位是什么?

当然是进程

在这里插入图片描述

98. 讲讲 TCP封包和拆包 。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

封包和拆包的应用场景

在这里插入图片描述

代码示例

下面是一个简单的示例,展示了如何通过固定包头实现封包和拆包:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdint>class TCPProtocol {
public:// 封包,简单例子: 包头包含数据长度// 封包:把字符串变成「4字节长度 + 原始字节」std::vector<char> packetize(const std::string& data) {// 数据长度(32 位)uint32_t len = data.size();// 申请完整包空间:4 + len/*packet: [ 00 00 00 0B ] [ 48 65 6C 6C 6F 2C 20 54 43 50 21 ]└─4B长度=11──┘  └──────────11 字节原始数据──────────┘^ packet.data()^ packet.data() + sizeof(len)src:   data.data() ->  H  e  l  l  o  ,     T  C  P  !*/std::vector<char> packet(sizeof(uint32_t) + len);// 包头: 数据长度// 写包头:把长度的 4 字节拷到包起始// .data() 是 std::vector 的成员函数(std::string 也有)。作用是返回指向底层连续存储的原始指针,方便跟 C 接口(如 memcpy/recv/send)交互。std::memcpy(packet.data(), &len, sizeof(len)); //这一步将数据长度作为包头写入数据包的起始位置// 数据//这一步将实际的数据内容写入到数据包中// 返回 std::string data 的起始地址(const char*),也就是要拷贝的源数据。std::memcpy(packet.data() + sizeof(len), data.data(), len);return packet;}// 拆包std::string depacketize(const std::vector<char>& packet) {uint32_t len = 0;// 读取包头// 把数据包开头的 4 个字节拷进本地变量 lenstd::memcpy(&len, packet.data(), sizeof(len));// 读取数据//这个操作会将数据部分从字节数组 packet 中提取出来,并存储在字符串 data 中。// 构造:从 s 开始拷 count 个字节(不需要 '\0' 结尾)// std::string::string(const char* s, size_t count);std::string data(packet.data() + sizeof(len), len);return data;}
};int main() {TCPProtocol protocol;// 原始数据std::string data = "Hello, TCP!";// 封包std::vector<char> packet = protocol.packetize(data);// 模拟接收后拆包std::string receivedData = protocol.depacketize(packet);std::cout << "Received Data: " << receivedData << std::endl;return 0;
}

在这里插入图片描述

在这里插入图片描述

99. 谈谈你对网络编程中 epoll的理解

在这里插入图片描述
在这里插入图片描述

代码示例

#include <sys/epoll.h>
#include <unistd.h>
#include <stdio.h>#define MAX_EVENTS 10int main() {int epoll_fd = epoll_create1(0);if (epoll_fd == -1) {perror("epoll_create1");return -1;}// 假设 sock_fd 是已建立的 socket 连接int sock_fd; // 此处应有 socket 初始化和连接代码struct epoll_event ev;ev.events = EPOLLIN; // 监听读事件ev.data.fd = sock_fd;if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock_fd, &ev) == -1) {perror("epoll_ctl: sock_fd");return -1;}struct epoll_event events[MAX_EVENTS];while (true) {int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // 无限等待事件发生if (nfds == -1) {perror("epoll_wait");return -1;}for (int i = 0; i < nfds; ++i) {if (events[i].events & EPOLLIN) {char buf[512];ssize_t count = read(events[i].data.fd, buf, sizeof(buf));if (count == -1) {perror("read");return -1;} else if (count == 0) {// 对端关闭连接close(events[i].data.fd);} else {// 处理读取的数据printf("Received: %s\n", buf);}}}}close(epoll_fd);return 0;
}

100. C++中智能指针的种类有哪些?

在这里插入图片描述
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

http://www.dtcms.com/a/323770.html

相关文章:

  • 数据库删除术:逻辑删除 vs 物理删除,选错毁所有
  • Flink提交流程全解析:从模式到实践
  • Java高并发场景下的缓存穿透问题定位与解决方案
  • 计算机网络:子网的起始地址就是默认的网络地址吗?
  • Flink SQL 中的水印机制
  • 26.Scikit-learn实战:机器学习的工具箱
  • Unity笔记(四)——Camera、碰撞检测函数、刚体加力、音频
  • CSDN 五周年创作纪念日(PS:vnjohn)
  • C++设计模式单例模式(饿汉、懒汉模式)
  • 基于 RabbitMQ 死信队列+TTL 实现延迟消息+延迟插件基本使用
  • 检索召回率优化探究五(BGE-M3 混合检索):基于LangChain0.3 集成Milvu2.5 向量数据库构建的智能问答系统
  • 【Matplotlib】中文显示问题
  • Vue3 组件化开发
  • 第4章 程序段的反复执行1 for语句P115练习题(题及答案)
  • 堆----3.数据流的中位数
  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • 2025AI颠覆认知!解锁智能新纪元
  • Kubernetes 无法识别你定义的 `CronJob` 资源*逐步解决方案
  • AI推理的“灵魂五问”:直面2025算力鸿沟与中国的破局之路
  • PowerShell 入门系列(五):运行命令与命令剖析详解
  • 面试题-----Spring Cloud
  • n8n 入门指南:更适合跨境出海搞钱的AI智能体
  • 7天精通Coze智能体实操手册(Day 1)
  • 健全性测试(Sanity Testing):你软件的快速“体检” ✅(省时避坑,确保核心!)
  • 【三个数绝对值排序】2022-10-10
  • 心灵笔记:思考三部曲
  • 记忆化搜索@cache与自己创建一个字典进行存储有区别吗
  • 10.final, finally, finalize的区别
  • Level-MC 11“天空”
  • SpringBoot配置生效优先级