Liangjf

The darkest hour is that before the dawn.

《Effective STL》

14《使用reserve来避免不必要的重新分配》

条目十四《使用reserve来避免不必要的重新分配》 使用vector和string的插入元素的时候,我们是不用担心内存问题的(只要不超过容器的max_size)。因为底层有分配子管理内存。在插入元素的时候,内存不够会发生像realloc的过程: 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增 长。也就是说,当容器必...

《Effective STL》

13《尽量使用vector和string来代替使用数组》

条目十三《尽量使用vector和string来代替使用数组》 数组在现代编程语言中基本都存在,应用可谓广泛,不可或缺,虽然在一些语言中(go)有切片等数据结构,但是数组还是存在的。 但是在有了stl后,在使用数组时更建议用vector和string来代替,因为在动态分配数组的内存时,需要人为的管理内存。比如在new T[]时,需要在用完分配的数组后先手工释放数组存放的对象,然后再释放数组...

《Effective STL》

12《切勿对slt容器的线性安全性又不切实际的依赖》

条目十二《切勿对slt容器的线性安全性又不切实际的依赖》 这一条目,我想用简短而有力的语句来总结。 stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能有所损耗的,这样就得不偿失了,还是让开发者自己按需实现。标准没有在库实现线性安全。一般是厂商实现,可能吧,只能是期望,不一定的。 我们可以期望: 1.stl提供多个线程读是安全的 2.st...

《Effective STL》

11《理解自定义分配子的合理用法》

条目十一《理解自定义分配子的合理用法》 根据大牛们的测试: STL默认的内存管理器(allocator)太慢,或者浪费内存,或者在使用的时候会产生内存碎片。 又或者需求不一样时: 1.allocator是多线程安全的,而你运行环境是单线程,所以想减少线程同步带来的te不必要开销。 2.当想把容器的对象放到一个特殊堆的相邻位置,做到引用局部优化。 3.建...

《Effective STL》

10《了解分配子(allocator)的约定和限制》

条目十《了解分配子(allocator)的约定和限制》 在STL标准库中,分配子的存在有点怪异。 一开始的设计意图是提供一个内存模型的抽象,让使用库者库忽略操作系统的near指针和far指针问题。但此目的没有达到。另一个目的是为了有利于开发作为对象形式存在的内存管理器。 从书中的这句话,其实我咋一看下去是比较模糊。细细琢磨,stl中的allocator就是发育畸形了,没有按照本...

Ntrip协议

Ntrip协议

Ntrip协议 在RTK接收机中,有多种方式获取到差分数据:电台、挂外串口、网络等。其中网络方式适合在有网络基准站的地区,省掉携带多一台RTK接收机来完成工作。 CORS是网络基准站,通过网络收发GPS差分数据。用户访问CORS后,不用单独架设GPS基准站,即可实现GPS流动站的差分定位。 访问CORS系统,就需要网络通讯协议。NTRIP是CORS系统的通讯协议之一。 下面看整个访问...

《Effective STL》

9《慎重选择删除元素的方法》

条目九《慎重选择删除元素的方法》 不同容器删除元素的方法是有区别的。 对于删除容器里的一个元素 序列容器( string, vector, deque)最高效的方法是erase-remove。 list最高效的方法是remove。 关联容器没有remove成员函数,只有erase,直接用erase函数来删除元素。 若删除容器里符合一个判别式的元素: 序列容器( string, ve...

《Effective STL》

8《永不建立auto_ptr的容器》

条目八《永不建立auto_ptr的容器》 重要的事说三次,永不建立auto_ptr的容器,永不建立auto_ptr的容器,永不建立auto_ptr的容器!!! 为什么? 实质是auto_ptr指针在转移时把原本的指针置为NULL,然而在STL容器中的一些操作是包含数据转移操作的。 比如排序sort(),在STL中,容器的sort的底层是基于多种排序算法的,其中的快排更是最重要的一种。...

《Effective STL》

7《如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉》

条目七《如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉》 在STL中容器是智能的,可以在容器销毁时自动调用容器里对象的析构函数来销毁容器存储的对象。 STL的容器虽然比较智能,但是没有智能到可以自动销毁new出来的指针对象。 所以在使用STL中的容器时,如果保存的是mew出来的对象的指针。如果在容器销毁之前没有把new出来的对象释放,...

《Effective STL》

6《当心C++编译器中最烦人的分析机制》

条目六《当心C++编译器中最烦人的分析机制》 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制。 C++中的普遍规律相符,即尽可能地解释为函数声明。 把形式参数的声明用括号括起来是非法的,但给函数参数加上括号却是合法的,所以通过增加一对括号,我们强迫编译器按我们的方式来工作。 例如: 这样是不正确的,因为形参含有括号 争取做法: ...