Loker's blog


  • 首页

  • 归档

C++_内存管理

发表于 2021-02-21 | 分类于 面试 , 内存管理

C++内存管理

C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。

栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。
堆:动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。
全局区/静态存储区(.bss 段和 .data 段):存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。
常量存储区(.data 段):存放的是常量,不允许修改,程序运行结束自动释放。
代码区(.text 段):存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里。

阅读全文 »

C++编译过程

发表于 2021-02-18 | 分类于 面试

C++编译过程

一般的C++程序在编译过程中需要进行如下四步:

预处理(Preprocessing)
预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多

1
gcc -E -I./inc test.c -o test.i

上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-I指定头文件目录,这里指定的是我们自定义的头文件目录;-o指定输出文件名。
编译(Compilation)
编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下:

1
gcc -S -I./inc test.c -o test.s

上述命令中-S让编译器在编译之后停止,不进行后续过程。编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件,内容如下:
汇编(Assemble)
汇编过程将上一步的汇编代码转换成机器码,产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成:

1
as test.s -o test.o

等价于

1
gcc -c test.s -o test.o

链接(Linking)
链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件

1
ld -o test.out test.o inc/mymath.o ...libraries...
阅读全文 »

RxJS 入门

发表于 2016-12-19

RxJS 介绍

RxJS 是一个通过使用observable序列来组合异步和时间驱动程序的库。它提供了一个核心类型,Observable, 还有其他类型(Observer, Schedulers, Subjects),和类似Array中的
操作符, 如(map, filtr, resuce, every, etc),通过这些来像处理集合一样来处理异步时间。

Think of RxJS as Lodash for events(可以认为RxJS是时间处理中的lodash)

ReactiveX 结合了观察者模式和迭代器模式和集合的函数式编程来满足管理序列化时间的理想方式。

在RxJS中的重要概念主要有:

  1. Observable: 代表了一种异步的值或事件的可调用的集合
  2. Observer: 是一个知道如何监听通过Observable传递值的回调函数集合
  3. Subscription: 代表了Observable和执行, 主要用来取消Observable的执行
  4. Operators: 是一种纯函数,使得能够用像map,filter,concat,flatmap等函数操作符来处理集合
  5. Subject: 和EventEmitter相同,而且是唯一的方式能够像多个Observer广播值或事件
  6. Schedulers: 是用于控制并发的集中调度器, 并允许我们来协调计算比如在使用setTimeout或者requestAnimationFrame时

第一个例子

通常我们这样注册事件

1
2
var button = document.querySelector('button');
button.addEventListener('click', () => console.log('Clicked!'));

如果使用RxJS的话我们可以这么写

1
2
3
var button = document.querySelector('button');
Rx.Observable.fromEvent(button, 'click')
.subscribe(() =>console.log('Clicked!'));
阅读全文 »

3 日志
2 分类
3 标签
RSS
GitHub E-Mail
© 2021 Loker
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4