0%

引子

声明一个模板函数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类型的对象在拷贝赋值销毁时的行为。

阅读全文 »

inode

硬盘的最小存储单位是扇区(Sector),块(Block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是4Kb,约为8个连续的扇区组成(每个扇区存储512字节)。计算机的内存是基于字节编址的,就像一个文件可能会占用多个Block,但是一个块只能存放一个文件。

虽然,我们将文件存储在了块(Block)中,但是我们还需要一个空间来存储文件的元数据(Meta Data),如:某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种存储文件元信息的区域就叫inode,译为索引节点(Index Node)。 每个文件都指向一个inode,存储文件的元信息。

阅读全文 »

CRLF和LF

重视由于历史的原因,各种不同的操作系统在处理行尾结束符采取了不同的处理方法:

  • CRLF(carriage return line feed),即“回车换行”,是Windows下的文件换行符\r\n
  • LF(line feed),即“换行”,是类Unix下的文件换行符\n
  • CR(carriage return),即“回车”,是Mac OS下的文件换行符\r(现在Mac OS X下已经改回LF)

关于产生CRLF和LF的历史原因可以看这篇文章:CRLF和LF的差异

阅读全文 »