探索 C++ (一)

参考书籍:
《Professional C++》、《C++ in Action》、《C++ 代码设计与重用》
《C++ 标准库》、《深度探索 C++ 对象模型》
《Modern C++ Programming with Test-Driven Development》、《Effective Modern C++》

程序之母

面向过程

1
2
3
4
5
6
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}

面向对象

1
2
3
4
5
6
7
8
9
#include <iostream>
class HelloWorld
{
public:
HelloWorld() { std::cout << "Hello "; }
~HelloWorld() { std:cout << "World!\n"; }
}
HelloWorld helloWorld;
int main() { }

more >>

程序员的自我修养 - 从Hello World!说起

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

背景知识

  • 不要让CPU打盹:分时多任务、进程、抢占式分配CPU;
  • 磁盘:扇区、LBS(逻辑扇区号)、文件系统;
  • 内存不够怎么办:1. 分段(解决地址空间不隔离);2. 分页【页大小、虚拟页/物理页、页错误和MMU(虚拟地址到物理地址的转换)】(解决使用效率低);
  • 线程:一个进程由一个或多个线程组成;一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成;状态(就绪、运行、等待);Linux的多线程(fork、exec和clone、写时复制);
  • 线程安全:竞争与原子操作、同步与锁(二元信号量和信号量【即多元信号量】、互斥量和临界区、读写锁、条件变量);可重入;
  • volatile:阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回;
  • 对象构造(pInst = new PInst())包含三个顺序的步骤:1. 分配内存;2. 在内存的位置上调用构造函数;3. 将内存的地址赋值给pInst;【在上述三个步骤中,CPU完全有可能动态调整2和3的执行顺序!】
  • 线程并发模型:1. 一对一模型;2. 多对一模型(将多个用户线程映射到一个内核线程上);3. 多对多模型;

Hello World 程序构建

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}

初级:

  1. 预处理: $ gcc -E hello.c -o hello.i 或 $ cpp hello.c > hello.i
  2. 编译: $ gcc -S hello.i -o hello.s(现在版本的 GCC 把预处理和编译两个步骤合并成一个步骤,使用一个cc1的程序。)
  3. 汇编:$ as hello.s -o hello.o 或 $ gcc -c hello.s -o hello.o(根据汇编指令和机器指令的对照表一一翻译即可。)
  4. 链接:$ ld -static /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.3/crtbeginT.o -L/usr/lib/gcc/1486-linux-gnu/4.1.3 -L/usr/lib -L/lib hello.o —start-group -lgcc -lgcc_eh -lc —end-group /usr/lib/gcc/i486-linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

more >>

Go语言精简总结(Part One) - The way to Go

安装

1
2
3
4
5
6
7
8
9
$ apt-get install bison ed gawk libc6-dev mercurial python-setuptools python-dev build-essential
$ hg clone -r release https://go.googlecode.com/hg/ go
$ export GOROOT=$HOME/go
$ export GOARCH=amd64
$ export GOOS=linux
$ export GOTOOL=$HOME/go/pkg/tool/linux_amd64/
$ export PATH=.:$PATH:$GOBIN:$GOTOOL
$ cd go/src
$ ./all.bash

更新go版本

1
2
3
$ cd $GOROOT && hg identify
$ hg pull && hg update release
$ ./all.bash

Workspace 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bin/
todo # command executable
pkg/
linux_amd64/
code.google.com/p/goauth2/
oauth.a # package object
github.com/nf/todo/ task.a
src/
code.google.com/p/goauth2/
.hg/ # mercurial repository metadata
oauth/
oauth.go # package source
oauth_test.go # test source
github.com/nf/
todo/
.git/
task/
task.go # package source
todo.go

more >>