天天看点

C++问题少年系列

记录一下个人在学习过程中碰到的或者想到的各种问题

目录

  • ​C++标准特性问题​
  • ​​关于花括号的构造问题​​
  • ​​隐式转换​​
  • ​​函数模板​​
  • ​​现有i++还是先有++i​​
  • ​STL的问题​
  • ​​二分查找​​
  • ​​OOP与GP​​
  • ​​Malloc​​
  • ​​类型萃取​​

C++标准特性问题

关于花括号的构造问题

class Base {};

Base b1 = {};
Base b2{};
      
C++问题少年系列

隐式转换

C++问题少年系列

第一行代码显式构造

第二行代码用到了两个隐式转换,先转换成​

​double​

​,再转换成​

​Fraction​

第三行代码用到了一个隐式转换,转换成​

​Fraction​

函数模板

C++98和C++11中函数模板的区别

C++问题少年系列
C++问题少年系列

如何实现函数模板的偏特化​

现有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

C++问题少年系列

全局​

​sort​

​中使用的迭代器指针是要求支持随机访问的(RandomAccessIterator),也就是说该泛型指针支持++操作。而​

​list​

​是双向链表,每个节点在内存空间上的分布不是连续的,所以不支持使用全局的​

​sort​

​方法。

Malloc

​malloc​

​操作具有一定的开销,其申请的内存大小其实略大于程序员要求的大小,因为包含了一定大小的头部和尾部,成为Cookies,用来记录一些必要的信息。所以说,当程序员申请的内存空间非常小时,Cookies的占比就会非常的高。若程序员多次申请非常小的内存,例如一百万次,那么就会产生难以忍受的额外开销。解决这种问题的方法之一是内存池(一次性申请一大块,然后自己写一个类来分配)

所以假设容器中有一百万个小元素,那么使用相应的​

​allocator​

​取申请一百万次内存空间,且该​

​allocator​

​只是对​

​malloc​

​的简单包装,也就是说调用了一百万次​

​malloc​

​,那么效率会很低,导致总的Cookies占量非常高。

类型萃取

​iterator_traits​

​的简单机理实现

C++问题少年系列

继续阅读