cryptto 加解密的,太专业
json json解析的
atexit.cc,顺便可以看一下crt0.c了解下程序的启动和关闭过程
程序退出前做动作的,通过超出变量范围时调用析构,执行事先注册在一个栈变量的函数,具体是执行的啥没看过
首先其他函数调用RegisterCallback
然后退出前具体执行 ProcessCallbacksNow();
base_switches.cc一些设置选项怎么用还待查
basictypes.h
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
这个用法很是奇怪,google了下,发现跟stdlib的_countof是一样的
atlapp.h中的,符合一般的习惯用法
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
stdlib.h中的,跟google这个一个原理
template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))
具体解释参见http://blog.sina.com.cn/s/blog_494684f00100ihkd.html
为啥简单问题复杂化,难道atlapp中的不好么?继续看下去就知道答案了,
#define ARRAYSIZE_UNSAFE(a) ((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
如果被传入的参数是个指针?safe就会报个编译错误,unsafe会返回一个你不想要的值,看google的代码就像看书,注释很详细
在vc下,sizeof不会返回0,但是gcc会
!(sizeof(a) % sizeof(*(a)))这个不知道什么意思,它里面说是bool跟具体实现相关,可能某些bool只占一个位?
// Since the size of bool is implementation-defined, we need to cast
// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final
// result has type size_t.
A bit field is an std::vector<bool>. It is a specialization of vector designed to optimize memory utilization. Every element in a bit field uses exactly 1 bit. The capacity of a bit field can only grow in multiples of 8, though.
lazy_instance.cc
使用位置new操作符 return new (instance) Type();
int8 buf_[sizeof(Type)]; // Preallocate the space for the Type instance.
单例模式相对于全局静态变量,最大的问题就是多线程竟态下的不可预知性
google怎么做的呢?他通过原子操作InterlockedCompareExchange来比较是否为0
是的话,创建完成之后设为end,然后其他线程循环判断并sleep(0)等待创建完成,但是这个state_变量啥时候变成0的呢
难道这个类在外面也始终作为全局变量来用?是做为全局变量的
这个问题其实很难碰到,
写写应用,估计是从来不需要考虑这种问题
pickle.cc 处理其他格式合并到内存的一个类,以前都是使用结构,他这个不需要预定义结构了,只要打包进去就行了,再按顺序解包就行了
tuple 强大的元组出现了,以前要做这事,就得定义一大堆的struct,模板的使用很强大
终于看明白Messageloop类了,首先定义一个全局变量
base::LazyInstance<base::ThreadLocalPointer<MessageLoop> > lazy_tls_ptr(
base::LINKER_INITIALIZED);
这个会创建出ThreadLocalPointer,这个类的目的就是创建出来后,会分配一个tls slot,然后所有的messageloop就都用这个slot保存this变量,然后每个线程要用messageloop的时候从tls里取出来,所以一个线程里只能存在一个messageloop
感觉这个lazyinstance很蛋疼,只能用在全局变量处,跟弄个普通全局变量差距很大么?
也解决不了静态变量初始化顺序不确定的问题?难道只是为了省掉那个new的动作?这样的话google对性能的要求也太离谱了吧
chrome里大量使用栈内存,就为了一个指令的优化?内存碎片chrome应该不用考虑吧,频繁的开关进程
特别说下messagepumpforui,他会创建一个窗口用来产生计时器和接收kMsgHaveWork消息来调用ScheduleWork来唤醒这个线程
然后run 死魂环接收消息,其中第一个工作就是判断是否存在windows消息,如果存在,就转发给AcceleratorHandler,这里会判断是否
设置了热键,如果没有就 TranslateMessage(&msg);
DispatchMessage(&msg); 转发出去,然后windowimpl就会接收到