glibc
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。
syscall()
syscall() 执行一个系统调用,根据指定的参数number和所有系统调用的汇编语言接口来确定调用哪个系统调用。
例子:获取线程ID,gettid()
#include <sys/syscall.h>
tid = syscall(SYS_gettid);
其中,SYS_gettid的定义为:
#define SYS_gettid __NR_gettid
#define __NR_gettid 224(实际定义在/usr/include/asm/unistd.h)
数字224即为system call number.
双感叹号(!!)的含义
表示进行两次逻辑非操作:
!!(400) = 1
!!(-200) = 1
!!(0) = 0
static_assert
C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。
其语法很简单:static_assert(常量表达式,提示字符串)。
如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。
incomplete type
不完整类型是一种用于描述标识符而无法确认该描述符大小的类型。
如一个类只有声明没有定义,一个数组没有指定大小等。
如果类型T是个不完整类型,那么sizeof(T)就等于0
_tmain()
_tmain是main为了支持unicode所使用的main的别名 ._tmain()不过是unicode版本的的main().
定义于<stdafx.h>中:#define _tmain main
_tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数。 函数签名为: int _tmain(int argc, TCHAR *argv[])
当你程序当前的字符集为unicode时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int wmain(int argc, wchar_t *argv[]) `
当你程序当前的字符集为ANSI时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int main(int argc, char *argv[])
Link Time Code Generation(LTCG)
传统的编译模式(词法解析-〉代码生成-〉链接),决定了在生成代码时,编译器只能看到同一个obj文件的内容,因此,优化也只能在obj文件里进行。
LTCG的引入,则颠覆了这种模式,将链接器提前到代码生成之前,并由之来调用代码生成,这样,在生成代码的时候,编译器便不太容易受到obj文件边界的限制,产生link time优化。
link time优化就是在拿到所有编译单元结果了之后,在全局做的一个优化,这时候可以理解成整个编译域变成一个编译单元,很多compile时刻的优化可以linktime做了。
可能导致的结果是:有些函数,虽然没有被标上inline,却被编译器自动inline了。
off_t类型
off_t类型用于指示文件的偏移量,其默认为一个32位的整数,在gcc编译中会被编译为long int类型,在64位的Linux系统中则会被编译为long long int,这是一个64位的整数,头文件<sys/type.h>。
reinterpret_cast的使用
将整型转换为指针值,从而定义一个无效的指针值:
reinterpret_cast<Timer*>(UINTPTR_MAX)