四季

Seasons

 对C/C++程序员来说,sizeof可以说再熟悉不过,sizeof是一个 C/C++中的运算符,在编译阶段计算并返回一个对象或数据类型所占用的内存大小(单位: 字节)。sizeof看起来简单,但是对它不了解很容易在代码中留下陷阱。比如:当传入一个表达式给sizeof时,它只会返回表达式计算结果的类型大小,但它不会对表达式求值。

Read more »

阅读本文需要对TCP/IP协议簇和linux系统有一定了解。

一、RPC介绍

1.1 RPC是什么

RPC (Remote Procedure Call):一个计算机通信协议,基于扩展常规或本地过程调用的概念。因此被调用过程不必与调用过程存在于同一地址空间中。这两个进程可能位于同一系统上,也可能位于不同的系统上,并通过网络连接它们。程序员就像调用本地程序一样,无需额外地为这个交互编程(无需关注细节)。
在这里插入图片描述
上图表示两个联网系统之间 RPC 调用流程。客户端进行过程调用,向服务器发送请求并阻塞等待,直到收到答复或请求超时。当请求到达时,服务器执行对应的请求过程,并将执行结果发送给客户端。客户端收到应答消息后被唤醒继续运行。

Read more »

一、基本概念

1.1 qcow2是什么

qcow2 是一种虚拟磁盘镜像格式,全称是 “QEMU Copy-On-Write version 2”。它可以用一个文件的形式来表示一块固定大小的块设备磁盘。

  • 动态分配:qcow2 支持按需分配空间,不会立即占用所有磁盘容量,而是随着数据写入逐渐扩展大小,节省存储空间。

  • 支持快照:qcow2 格式允许创建快照。

  • 压缩和加密:qcow2 格式支持对数据进行压缩以减少磁盘空间,并可以启用AES加密来保护镜像数据的安全。

  • 写时复制(Copy-On-Write, COW):这意味着只有在镜像文件上有新的写操作时,才会实际改变文件内容,这样可以更高效地使用磁盘空间。

Read more »

一、FUSE基本概念

1.1 FUSE 是什么

FUSE 是 Filesystem in Userspace 的缩写,也就是常说的用户态文件系统
Linux内核官方文档对 FUSE 的解释如下:

What is FUSE?FUSE is a userspace filesystem framework. It consists of a kernel module (fuse.ko), a userspace library (libfuse.*) and a mount utility (fusermount).

Read more »

一、智能指针简介

1.1 为什么需要智能指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 动态申请资源后忘记释放
void UseRawPointer()
{
string *str = new string("hello world");

return;
}

void UseRawPointer()
{
string *str = new string("hello world");

// 发生异常

delete str; // 虽然写了释放内存的代码,但是遭到函数中段返回,使得指针没有得到释放

return;
}

在使用传统指针时,需要手动分配和释放内存,这可能会导致内存泄漏(未释放已分配的内存)或释放后的野指针(指向已释放的内存)。智能指针通过自动内存管理来帮助解决这些问题,确保在不再需要内存时自动释放它。

Read more »

一、多态基础

1.1 静态编联与动态编联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Shape 
{
public:
void show() const {
cout << "area: " << get_area() << endl;
}

float get_area() const { return 0; }
};

class Rectangle : public Shape
{
public:
Rectangle(float w, float h)
: _width(w), _height(h) {}

float get_area() const { return _width * _height; }

private:
float _width;
float _height;
};

class Circle : public Shape {
public:
Circle(float r) : _radius(r) {}

float get_area() const { return _radius * _radius * 3.14; }

private:
float _radius;
};

int main()
{
Rectangle rect(1, 2);
Circle cir(1);
Shape &sp1 = rect;
Shape &sp2 = cir;
sp1.show(); // 输出0
sp2.show(); // 输出0

return 0;
}

运行上面代码发现,矩形和圆求出的面积都为0,与我们预期不符合,这是为什么呢,原因在于使用静态编联。

Read more »

一、继承概念与语法

1.1 继承是什么

 继承(Inheritance)是面向对象编程程序设计(OOP)的一个重要特征。它允许一个类(派生类)继承另一个类(基类)的属性和方法,并可以在此基础上修改已有的功能或增加新的功能。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,继承是类设计层次的代码复用。

Read more »

前言:在早期C/C++中auto关键字的作用是:一个存储类型指示符,使用auto修饰的变量,存储类型为自动存储期,从变量声明处生命周期开始,出变量所在代码块生命周期结束,并且全局变量不能用auto修饰。但是局部变量的生命周期本来就是进入作用域生命周期开始,出作用域生命周期结束。导致用auto修饰局部变量和不使用auto修饰没有任何区别,处于一个尴尬地步。

Read more »

一、static_cast

static_cast 在编译时进行类型转换,在转换时会进行一些类型检查以确保转换是相对安全的,但不包括运行时类型检查static_cast 无法强制转换掉 constvolatile__unaligned 特性。

语法:仅根据表达式中存在的类型,将 expression 转换为 type 类型。

static_cast <type> ( expression )

Read more »

一、lambda是什么

在 C++ 11 及更高版本中,Lambda 表达式(通常称为 Lambda)用来定义匿名函数对象,用来作为参数传递给算法或者作为匿名函数进行调用,使得代码更加灵活简洁。

Read more »
0%