C++八股3
1.什么是大小端存储?大端存储:数据的最高有效字节存放在内存地址的最低位置
小端存储:最低有效字节被存放在内存地址的最低位置
注:在网络协议中通常使用大端序
2.volatile、mutable和explicit关键字的用法
volatile:
volatile关键字用于告诉编译器,该变量的值可能会在程序控制之外被改变(如硬件中断、操作系统、其他线程等)。因此,编译器不应该对涉及该变量的操作进行优化。
每次访问volatile变量时,都会从内存重新读取数据,而不是使用寄存器中的缓存副本。(这样可以防止变量被其他线程修改后读到错误的变量值)
注:现代编译器为了提高性能,通常会将经常访问的变量值保存在CPU寄存器中,以便快速访问。
mutable: mutable关键字用于允许对象的某些成员变量即使在const成员函数内也可以被修改。
12345678910111213141516171819202122232425262728#include <iostream>class Person {private: int age; // 年龄 muta ...
C++八股2
C++八股21.C++中const和static的作用static:
不考虑类的情况
隐藏:当使用static修饰全局变量或函数时,它们将仅在定义它们的文件内可见(即具有内部链接性),而没有static修饰的全局变量和函数则可以在其他文件中通过声明来引用。
注:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
默认初始化为0:无论是未初始化的全局静态变量还是局部静态变量,默认情况下都会被初始化为0,并且这些变量都存储在全局未初始化区。
持久存在与记忆性:如果在函数内部定义了静态变量,那么这个变量在整个程序运行期间一直存在,只会被初始化一次,并且即使函数退出后仍然存在,但它的作用域是局部的。
考虑类的情况
static成员变量:必须在类外部进行初始化
static成员函数:没有this指针,不能访问类的非静态成员变量或调用非静态成员函数。
const:
不考虑类的情况:
不可变性:一旦定义了一个const常量,就必须同时对其进行初始化,之后其值不能再被修改。
参数传递:用const修饰传入参数,则函数保证传入参数不发生改变
考虑 ...
CMake
CMakeCMake编译过程
创建CMakeLists.txt文件:touch CMakeLists.txt
使⽤cmake,生成makefile文件
使⽤make命令编译,生成了可执行程序
PROJECT
PROJECT:来指定工程的名称
1PROJECT (HELLO)
add_executable:定义工程会生成一个可执行程序
1add_executable(可执行程序名 源文件名称)
SET
显示地指定变量
SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp
多个cpp文件:SET(SRC_LIST main.cpp t1.cpp t2.cpp)
在 CMakeLists.txt 中通过 set 命令指定所使用的C++标准:
123456#增加-std=c++11set(CMAKE_CXX_STANDARD 11)#增加-std=c++14set(CMAKE_CXX_STANDARD 14)#增加-std=c++17set(CMAKE_CXX_STANDARD 17)
指定输出的路径:
12set(HOME /home/robin/ ...
Protobuf
ProtobufProtobuf序列化的步骤protobuf中的数据类型 和 C++ 数据类型对照:
使用protobuf进行序列化的步骤:
定义.proto文件: .proto文件来描述要序列化的数据结构
12345678//声明所使用的protobuf版本号syntax = "proto3";message Person { string name = 1; int32 id = 2; string email = 3;}
注:等号后面的编号要从1开始,每个成员都有一个唯一的编号,不能重复,一般连续编号即可。
编译.proto文件:使用protoc编译器将user_info.proto文件编译成C++代码
1protoc -I path <user_info.proto> --cpp_out=输出路径(存储生成的c++文件)
注1:-I: 参数后面可以跟随一个或多个路径,用于告诉编译器在哪些路径下查找导入的文件或依赖的文件,如protoc -I path1 -I path2 或 protoc -I path1:pa ...
Shell基础
Shell基础shell是一个命令行解释器,用于接收用户(应用程序)命令来调用系统内核。
脚本格式:以#!/bin/bash开头(指定解析器)
执行方式:
1.bash/sh + 绝对路径(相对路径)
2.绝对路径(相对路径)
需要可执行(x)权限
3.source + 绝对路径(相对路径): 在当前的shell下执行
子shell:在子shell中设置的当前的环境变量,对于父shell不可见
1.变量1.1 常用系统变量常用系统变量:$HOME、$PWD、$USR、$SHELL、$PATH
env: 列出当前 shell 的所有环境变量
set: 显示所有 shell 变量(包括环境变量和局部变量)
printenv+环境变量名: 输出某个环境变量的值
$PATH: 保存了搜索系统命令的路径(/usr/bin)
1.2 自定义变量自定义变量(局部变量):变量名=变量值(等号前后不能有空格)
局部变量导出为全局变量:export + 变量名
注:在子shell中修改全局变量对父shell不可见
只读变量:readonly 变量名=变量值
撤销变量:unset + 变量 ...
C++八股1
C++八股1.在main执行之前和之后执行的代码可能是什么
main函数执行之前,主要就是初始化系统相关资源:
设置栈指针
初始化静态static变量和global全局变量
调用构造函数
main函数执行之后:
全局对象的析构函数
2.指针和引用的区别
指针是一个变量,存储的是一个地址,引用是原变量的别名
指针可以为空,引用不能为NULL且在定义时必须初始化
3.在传递函数参数时,什么时候该使用指针,什么时候该使用引用呢?
需要返回函数内局部变量的内存的时候用指针。指针作为函数参数,需要在堆上动态分配内存,在函数外部仍然可以访问这块内存。完要记得释放指针,不然会内存泄漏。
对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销要更小
类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式
4.堆和栈的区别
申请方式不同。
栈由系统自动分配。
堆是自己申请和释放的。
申请大小限制不同。
栈顶和栈底是之前预设好的,栈是向栈底扩展(从高地址向低地址扩展),大小固定
注:栈空间耗尽(例如递归调用过深),会导致 栈溢出
堆向 ...
docker基础
1.docker与VMdocker的作用:实现跨平台的快速运行应用
docker为什么比VM快?
docker有着比虚拟机更少的抽象层:docker 容器共享宿主机的操作系统内核,不需要为每个容器启动一个完整的操作系统实例。而虚拟机需要为每个虚拟机启动一个完整的操作系统实例,这会占用更多的内存和 CPU 资源。
区别:
虚拟机:虚拟机是通过Hypervisor(虚拟机管理系统,常见的有VMWare、workstation、VirtualBox),虚拟出网卡、cpu、内存等虚拟硬件,再在其上建立虚拟机,每个虚拟机是个独立的操作系统,拥有自己的系统内核(GuestOS)。
容器:容器是利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。
2.docker基本组成
3.docker常用指令docker images:查看容器列表
启动容器:
docker run [-d] [--name] [-p] [-v] [--network] 容器名(指定) 容器 [-e]
docker run ...
C++设计模式
设计模式1.模板模式应用场景:算法所需的关键步骤已知,但具体实现未知
抽象类:定义算法的主体框架,具体实现由子类完成
具体子类:提供步骤的具体实现
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include <iostream>// 抽象类,定义了模板方法和步骤class Beverage {public: // 模板方法,定义了制作饮料的步骤 void prepareRecipe() { boilWater(); brew(); // 抽象步骤,由子类实现 pourInCup(); addCondiments(); // 抽象步骤,由子类实现 } // 基本步骤,不需要子类改变 void boilWater() { ...
Ori-Net: Orientation-guided Neural Network for Automated Coronary Arteries Segmentation
Ori-Net: Orientation-guided Neural Network for Automated Coronary Arteries Segmentation论文:《Ori-Net: Orientation-guided Neural Network for Automated Coronary Arteries Segmentation》(ESWA 2024)
主要贡献:
提出了一种利用预测方向和半径的定向制导跟踪方法。该算法迭代重建冠状动脉,并将重建与粗分割融合,进一步提高分割性能。
冠状动脉结构可以被表示为由不同半径的、以方向为指导的球体包络所重建的外包络
用半径和方向作为冠状动脉的两个基本度量。
注1:半径:当前位置到冠状动脉边界的距离;方向:从当前位置确定下一个位置的指向
注2:半径信息有助于确定血管的边界,而方向信息则确定血管延伸的方向。
Ori-NetOri-Net模型与UNet结构相似,Ori-Net模型利用了这种基于几何信息的分割方法,同时预测了冠状动脉的分割结果、半径和方向,并通过一个导向追踪的方法,利用预测的半径和方向来重建冠状动脉。
多任务学 ...
ASSNet:Adaptive Semantic Segmentation Network for Microtumors and Multi-Organ Segmentation
ASSNet: Adaptive Semantic Segmentation Network for Microtumors and Multi-Organ Segmentation论文:
《ASSNet: Adaptive Semantic Segmentation Network for Microtumors and Multi-Organ Segmentation》(arXiv 2024)
主要贡献:
设计了一种结合ResUnet和Swin-transformer优点的混合模型ASSNet,该模型具有窗口注意力、空间注意力、U型架构和残差连接,以实现高效分割。
提出了一种自适应特征融合(AFF)解码器,该解码器能够最大化利用多尺度特征,同时捕捉远程依赖并细化目标边界。
网络整体结构:
编码器:
通过在不同分辨率上应用窗口注意力,编码器能够捕捉到图像中的多尺度信息
引入了一个增强的多层感知器,以在特征提取过程中显式地建模长距离依赖关系
EFFN结合深度卷积和像素卷积来增强局部特征的提取能力
Adaptive Feature Fusion (AFF) Decoder:
...