记录一下个人在学习过程中碰到的或者想到的各种问题
目录
- C++标准特性问题
- 关于花括号的构造问题
- 隐式转换
- 函数模板
- 现有i++还是先有++i
- STL的问题
- 二分查找
- OOP与GP
- Malloc
- 类型萃取
C++标准特性问题
关于花括号的构造问题
class Base {};
Base b1 = {};
Base b2{};
隐式转换
第一行代码显式构造
第二行代码用到了两个隐式转换,先转换成
double
,再转换成
Fraction
第三行代码用到了一个隐式转换,转换成
Fraction
函数模板
C++98和C++11中函数模板的区别
如何实现函数模板的偏特化
现有i++还是先有++i
// 前置++
ListNodeIterator& operator++()
{
node = node->nextNode;
return *this;
}
// 后置++
ListNodeIterator operator++(int)
{
// 调用到拷贝构造函数 进行一次默认的浅拷贝 故需要自行书写拷贝构造函数 同时该拷贝构造函数不能为explicit
ListNodeIterator temp = *this;
// ListNodeIterator temp(*this); // 两种写法
operator++();
// ++(*this); // 两种写法
return temp;
}
从这种写法来看的话应该是先有
++i
,并且
++i
的开销更小,不需要构建一个临时变量。所以在
for
循环里头一般写
++i
STL的问题
二分查找
OOP与GP
全局
sort
中使用的迭代器指针是要求支持随机访问的(RandomAccessIterator),也就是说该泛型指针支持++操作。而
list
是双向链表,每个节点在内存空间上的分布不是连续的,所以不支持使用全局的
sort
方法。
Malloc
malloc
操作具有一定的开销,其申请的内存大小其实略大于程序员要求的大小,因为包含了一定大小的头部和尾部,成为Cookies,用来记录一些必要的信息。所以说,当程序员申请的内存空间非常小时,Cookies的占比就会非常的高。若程序员多次申请非常小的内存,例如一百万次,那么就会产生难以忍受的额外开销。解决这种问题的方法之一是内存池(一次性申请一大块,然后自己写一个类来分配)
所以假设容器中有一百万个小元素,那么使用相应的
allocator
取申请一百万次内存空间,且该
allocator
只是对
malloc
的简单包装,也就是说调用了一百万次
malloc
,那么效率会很低,导致总的Cookies占量非常高。
类型萃取
iterator_traits
的简单机理实现