ifdef和#if defined()的区别 | placement new | 函数指针 | void (set_malloc_handler(void (__f)()))() |
#ifdef和#if defined()的区别
1 | 后者可以组成复杂的预编译条件,比如 |
placement new
STL源码剖析中,空间配置器一章有这样一段代码:
1 | \ |
这个操作叫做placement new,就是在指针p所指向的内存空间创建一个T1类型的对象,但是对象的内容是从T2类型的对象转换过来的(调用了T1的构造函数,T1::T1(value))。
就是在已有空间的基础上重新调整分配的空间,类似于realloc函数。这个操作就是把已有的空间当成一个缓冲区来使用,这样子就减少了分配空间所耗费的时间,因为直接用new操作符分配内存的话,在堆中查找足够大的剩余空间速度是比较慢的。
placement new的好处:
在已分配好的内存上进行对象的构建,构建速度快。
可以反复利用同一块已分配好的内存,有效的避免内存碎片问题。
建立对象数组时,能够调用带参数的构造函数。
将一个数上调到8的倍数的技巧
STL源码剖析中,STL的第二级配置器会将任何小额区块上调为8的倍数。
1 | int round_up(int bytes){ |
obj volatile my_free_list
《STL源码剖析》p64。
1 | volatile关键字是为了防止cpu优化的,可以先去掉。 |
set_malloc_handler
之前只见过函数指针
1 | void(*fun)(),意思是定义了一个函数指针(这是一个变量),指向一个返回值和参数都为空的函数 |
在STL空间配置器部分,有这样的用法:
1 | static void (* __set_malloc_handler(void (*__f)()))() |
linux和windows中都有这样的用法,可以参考这个链接:https://blog.csdn.net/woyaowenzi/article/details/6086064
可能难理解的地方就在于,用void(*)()这样的方式来修饰函数的返回值吧。
不得不说Cpp的语法真是麻烦…
参考
- https://blog.csdn.net/u014209688/article/details/90047713
- https://blog.csdn.net/woyaowenzi/article/details/6086064
- 《STL源码剖析》侯捷
欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/
v1.5.2