0%

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的差异

阅读全文 »

本人原先也是在学校系统学过C,在工作之前对于C++的运用只是停留在”C With std::cout“的阶段,而工作后也没有时间系统阅读C++的大部头书籍,于是本文便作为一个碎片化学习历程的记录,记录一些常用的C++标准库使用技巧。

std::isdigit

判断一个字符是否是数字,通常可以这样实现:

bool IsDigit(char ch) { return ch >= '0' && ch <= '9'; }

也可以直接用std::isdigit
char ch = '8';
if (std::isdigit(ch)) {
// ...
}

阅读全文 »

研究大牛的作品是接近大牛的必要步骤——膜Linus Torvalds

版本控制的发展历史

创建一个README.md文件,写入两行文字:

Git is a distributed, open source version control system.
You can install git on Linux using binary release.

我们将它作为这个文件的第一个版本,之后有一天,我想再对它做一点修改:
Git is a distributed, open source version control system.
You can install git on Linux, Windows using binary release.
Or you can compile from source code.

在版本控制系统还没有出现之前,人们总是用不同的文件名来区分不同的文件版本。如果想未来能回滚到之前的版本,此时只能用README_2.md来去分它。随着版本越来越多,文件名越来越长,管理大量版本的文件成为了噩梦。

阅读全文 »

请求堆上分配内存需要操作系统的参与,频繁的向请求内存开销很大。为了优化这个问题,可以把预先分配一部分内存放在池子里。

C++在堆上创建对象一般是用newnew的执行包含了两个过程:

  1. 分配内存
  2. 初始化对象

delete的执行也包含了两个过程:

  1. 对象析构
  2. 释放内存

当创建单个对象的时候,我们拥有构造对象所需的值,我们通常希望内存分配和对象初始化组合在一起;但是连续分配一堆对象的时候,我们往往希望分配内存和对象初始化分离,先分配一大快内存,在需要时再按需执行对象的初始化,此时如果将内存分配和对象初始化放在一起则会导致不必要的性能开销。例如new std::vector<T>(10),我们希望只分配10个T类型的空间,而不执行T的默认构造方法,只有在emplace_back的时候才对内存初始化。

阅读全文 »

由于平时一直使用Arch Linux环境写代码,但是公司只给用Windows,对Windows MinGW开发环境的场景觉得很不顺手。由于业务是Linux业务,在本地开发无法编译,需要使用远程编译机编译。这种模式使得调试程序只能远端编译后,在远端不使用GDB,而GDB命令行不仅难用还有高昂的学习成本。最近新发现一写远程开发/调试的方案,再次整理出来以应付C++跨平台开发的场景。

创建样例程序

  • 本机环境:Windows X64
  • 远端环境:Linux(Armbian)aarch64
  • 本地IDE: VSCode
    创建一个CMake项目用于演示:
    .
    ├── build/
    ├── CMakeLists.txt
    ├── include/
    │   └── Student.h
    └── src/
    ├── main.cpp
    └── Student.cpp
    阅读全文 »