0%

Linux上可以快速创建一个超过卷自身大小的文件。例如/dev/nvme0n1p2对应的大小只有234GB:

╭─xuranus@Thanos ~/workspace 
╰─$ df -h
Filesystem Size Used Avail Use% Mounted on
dev 7.8G 0 7.8G 0% /dev
run 7.8G 1.6M 7.8G 1% /run
/dev/nvme0n1p2 234G 196G 26G 89% /
tmpfs 7.8G 172M 7.6G 3% /dev/shm
tmpfs 7.8G 21M 7.8G 1% /tmp
/dev/nvme0n1p1 500M 114M 386M 23% /boot
tmpfs 1.6G 76K 1.6G 1% /run/user/1000

dd if=/dev/zero bs=1M count=1 of=sparsefile seek=1000000以1MB为单位,从1000000的位置,即offset = 1M * 1000000处写入一个1M的数据块:
╭─xuranus@Thanos ~/workspace 
╰─$ dd if=/dev/zero bs=1M count=1 of=sparsefile seek=1000000
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00405439 s, 259 MB/s

ll -h可以看到文件空间占用达到了977GB:

阅读全文 »

项目地址https://github.com/XUranus/minijson

JSON是非常常用的结构对象序列化方式。相比于其他基于字节流的序列化方案(thrift,protobuff),JSON易于阅读和编辑;相较于同样基于文本的序列化方案XML,JSON在网络传输占用更小的空间。JSON很好平衡了序列化/反序列化的性能、可读性、空间占用的问题。

很多语言都在标准库中添加了JSON相关的API,但C/C++还没有。C++较为完善的开源JSON库有jsoncpp。这篇文件将介绍如何用1K行左右的代码实现一个精简C++的Json库。

阅读全文 »

C++虽然集成了C语言的explict cast和implict cast策略,但是作为一门更现代的语言,C++额外提供了一些类型检查,如检查指针和基础类型的转换,基类和派生类的转换等来提高编程的安全性。
主要有const_cast,reinterpret_cast,static_cast,dynamic_cast。其中const_cast主要用于处理const修饰,功能单一,可以看作一类,其他三类可以看作另一类。

const_cast

const_cast一般用于强制修改一个类型的读写权限,例如实现常量到变量引用的转换,以实现修改一些常量的目的。强制转换的类型必须是指针或引用。

const int v = 1;
int &mutv = std::const_cast<int&>(v);
mutv++;

const int *p = 1;
int *mutp = std::const_cast<int*>(p);
(*mutp)++;

阅读全文 »

引子

声明一个模板函数func(),在main()中调用它:

template<typename T>
int func(T&& v)
{
return v;
}

main()中调用它:

int main()
{
int a = 1;
func<int>(a); // compile error
func<int>(std::move(a));
return 0;
}

可以看到func<int>(a)这一行编译报错:error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’,原因显而易见:int func(T&& v)被特化成了int func(int&& v),只接受右值。
阅读全文 »

我们先来看一个matrix类在C++中如何实现:

class matrix {
private:
int nrow, ncol;
double** value;

public:
matrix(int r, int c);
};

首先定义字段,在matrix中定义了行数nrow和列数ncol,以及指向存储数据的指针value。然后定义构造函数matrix int r, int c)。由于matrix有一个指针字段value,指向的数据需要在堆上动态分配,所以matrix类型的对象在拷贝时需要注意深浅拷贝的问题,在栈上对象离开作用域则需要考虑析构的问题,所以我们还需要显式地或隐式地指定了matrix类型的对象在拷贝赋值销毁时的行为。

阅读全文 »