c++
文章平均质量分 71
ninesnow_c
这个作者很懒,什么都没留下…
展开
-
STL源码阅读小记(六)——Any
stl中any实现原创 2022-08-24 10:14:25 · 209 阅读 · 0 评论 -
STL源码阅读小记(五)——Shared_ptr
前言感觉好久没看stl了,中间跑去看图形学入门了,图形学是真的有趣,但是也是真难,不过接着补坑,把unique_ptr的好兄弟shared_ptr也看了。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility MacrosShared_ptr应该算是c++中的老熟人,应该绝大部分人应该使用过,或者在面试中见过它,对它的引用计数器印象深刻吧。这次我们看看stl的源码中shared_p原创 2022-04-21 14:58:22 · 984 阅读 · 0 评论 -
STL源码阅读小记(四)——Unique_ptr
前言继续看stl中常用东西的源码,打算把智能指针的坑给填了,这次先写点unique_prt,下次写shared_ptr。unique_prt的代码总体而言比较简单,唯一稍微复杂的地方就是对自定义析构函数的萃取。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility MacrosUnique_ptr依照惯例,来看一下定义的模板参数和一些typedef。template <cl原创 2022-02-22 11:05:31 · 883 阅读 · 0 评论 -
c++中enable_if和void_t的妙用
std::enable_ifstd::enable_if在c++中是个好工具,利用SFINAE对不同类型进行不同处理。个人总结一下,std::enable_if有四种使用方式,分为返回值,参数,类型模板参数,非类型模板参数,对于后两种需要c++11以上的版本才支持。举个例子,比如我需要输出一个数字,模板类型T需要为一个数字类型,我们来看看四种用法。返回值template<class T>typename std::enable_if<std::is_integral<T&原创 2022-02-15 15:32:51 · 913 阅读 · 1 评论 -
STL源码阅读小记(三)——Function
前言这几天简单的看了下list,deque发现基本实现和stl源码刨析中基本类似,由于stl是个大块头,就打算选择性的看把,一些像queue,stack这样的适配器也粗略瞄一眼,就不细看了。刚好最近使用funtion比较频繁,所以这次来看下function的实现。STL版本本文所使用的stl版本为libc++ 13.0,属于LLVM项目。LLVM项目Github如果遇到不熟悉的宏定义可以参考文档Symbol Visibility Macrosfunction先看看function的定义,由于f原创 2021-12-24 14:56:44 · 520 阅读 · 0 评论 -
C++中labmda效率问题
最近使用lambda进行替换原有逻辑,不经想到使用lambda与直接写逻辑究竟有什么区别。当然在不开优化下lambda会变成匿名函数,但是在开了O2优化的情况是否还是一样呢?是否lambda也是会进行内联。本文各种汇编代码皆是在开启O2优化的情况下生成,使用的是VS2019。最简单的labmda首先我我们先看一下最简单lambda。// main.cppint main(){ using namespace std; auto testf = []() { for (int i = 0原创 2021-12-15 10:39:08 · 1425 阅读 · 0 评论 -
STL源码阅读小记(二)——Vector
前言最近事情都完成差不多了,看看vecotr实现吧。vector算是stl中很常见的容器了,可能很多人学完c++语法,接触stl就是从vector开始的。vector的数据结构就不细细说明了,相信大家对数组这数据结构绝对都懂。另外看了标准库才明白要达到Standard Template实际上是很复杂的一件事。一些非常见的函数就只看看声明吧,以及一些类型萃取就不展示了,要完整的展示出来实在太太长了。一份vector<T>加上vector<bool>的源码大概在4000行左右。博客原创 2021-12-15 10:38:32 · 820 阅读 · 0 评论 -
STL源码阅读小记(一)——Allocator
Allocator前言STL版本AllocatorAllocator本体allocate函数deallocate函数construct函数与destroy函数小结个人博客备份前言最近开始阅读stl源码刨析一书,但是总觉得光看书是否有的不妥,便想着拉一份libc++的源码来看看现在的stl源码。大致想看完stl源码刨析中的内容,在看看C++11之后的一些内容是怎么实现的。不过开始阅读就遇到挺多困难,查手册能解决一大部分,还有一些为了性能而做的优化因为c++水平不足,就不一定能看的出来。总而言之这算是我自原创 2021-11-26 09:52:59 · 594 阅读 · 0 评论 -
c++利用模板实现抽象工程模式与原型模式
#pragma once#include<string>#include<map>template<class AbstractProduct>class AbstractRegister {public: AbstractRegister() = default; virtual AbstractProduct* createProduct() = 0;};template<class AbstractProduct>class Fact原创 2021-08-27 11:37:05 · 359 阅读 · 0 评论 -
c++实现懒汉单例模式
最近在看设计模式,单例模式是较为简单的一种设计模式,在c++11之后,标准保证局部静态成员变量在初始化时候的线程安全,这样就可以很容易的写出简洁的单例模式。不需要手动的做一个原子操作。我自己实现如下:#Singleton.h#pragma once#include<memory>template<class T>class Singleton {public: Singleton() = delete; Singleton(Singleton&) = del原创 2021-08-26 15:00:31 · 302 阅读 · 0 评论 -
c++模板线程池解读
前言本篇文章是我个人在阅读一个模板线程池适合遇到的困惑,了解c++11一些特性后总算是能看懂了,虽然C++11新特性不难,但是结合模板用起来会比较蒙的。线程池代码线程池代码来自github上,链接在这里#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#include <memory>#include <thread>#include &l原创 2021-08-11 17:04:24 · 348 阅读 · 0 评论 -
VS C++编译C2146和C4430错误
遇到的坑记一下如果你遇到了这样的错误:error C2146: syntax error : missing ‘;’ before identifiererror C4430: missing type specifier - int assumed.一条C2146错误跟着一条或多头C4430错误,可以考虑检查一下是否头文件互相包含。如-----AFile A.h-------#include"A.h"--------------------------BFile B.h-------原创 2021-08-10 17:21:35 · 1066 阅读 · 0 评论 -
C++构造函数使用初始化列表的坑
C++构造函数相信许多小伙伴一定使用C++中的构造函数。但是最近在看深度探索C++对象模型的时候发现了一个重要的坑点,就是使用初始化列表初始构造函数时是按照类内成员声明顺序构造的。如已下代码:#include<iostream>class A{public: int first = 0; int second = 0; A(int x):second(x),first(second){};};int main(){ A a(4); std:原创 2021-07-13 10:03:41 · 238 阅读 · 0 评论 -
C++ std::string不再使用COW实现的原因分析
引言这个问题是在个人处理HTTP响应头的时候突然冒出来的。因为我需要分割以CRLF结尾的各个参数,函数声明是这样的std::string retrieveUntilCRLFAsString(const char*)。每一次都要分割为std::string类型,都有一次拷贝的资源消耗,但这个资源开销有多大呢?这让我对string的性能产生了好奇。std::string实现方式COWCOW,也就是写时拷贝,是一种编译器级别上的优化手段,目的是为了减少一些无意义的深拷贝开销。据我了解,在g++4.5版本原创 2020-10-06 03:35:18 · 645 阅读 · 0 评论 -
一个基于优先队列的C++定时器
定时器定时器的实现方式有多种,底层实现有双向链表,最小堆实现以及时间轮。本文以基于最小堆实现一个简单的定时器。使用了C++ 11中实现了priority_queue模板,虽然名字中带有queue,但是实现方式是堆,名字中带有queue,只是因为使用queue的接口。Chrono库具体实现...原创 2020-09-17 13:51:34 · 1121 阅读 · 2 评论 -
C++简单线程池的实现
线程池基础知识C++ 11特性实现原创 2020-09-08 22:42:06 · 164 阅读 · 0 评论 -
c++ primer 16.1.2节练习 实现泛型vector
StrVec可以看我之前写个。不过在写本篇时候发现StrVec有bug。有时间再改吧因为写完本篇程序发现个奇怪的问题,程序用vec就没事,用vec就炸,排查了一下又是越界问题。这里吹一下vs,debug功能好强啊,因为string释放时会调用析构,导致free函数释放时多释放了一个空的指针。但基础类型销毁的时候没有析构函数所以没事。完整代码#include <iostream>#include<string>#include<vector>#include&.原创 2020-07-08 02:56:21 · 215 阅读 · 0 评论 -
c++ 构造函数 which is of non-class type奇葩问题
一个奇怪的问题,明明模仿书上代码小试一下,结果出现一个error: request for member 'push' in 's', which is of non-class type 'T_stack<int>()'|先上实现代码,先不要在意我为什么不直接用stl::stack,而是自定义的stack里套一个std::vector。这里是想试一下模板类。然后就出问题了。template <typename T> class T_stack{public: ty原创 2020-07-07 21:41:22 · 22664 阅读 · 2 评论 -
c++ primer 16.1.1练习 泛型编程
学了后,感觉模板编程实在是强了。练习 16.2template <typename T>int compare(const T &v1 , const T &v2){ if(v1 < v2 ) return -1; if(v1 > v2) return 1; return 0;}练习16.4template <typename T,typename N>T find_template( T v1 , T v2原创 2020-07-06 22:09:35 · 132 阅读 · 0 评论 -
C++Primer 13.5节练习 vector简化版本
完整版本放在最后面练习13.39size_t StrVec::reserve(size_t n) { auto newcapacity = n; auto old_size = size(); if (newcapacity < size()) //减少分配空间,多余的截断 old_size = n; auto newdata = alloc.allocate(newcapacity); auto dest = newdata;原创 2020-06-24 17:30:10 · 143 阅读 · 0 评论 -
c++ 13.1章课后练习 拷贝控制
@TOP感觉到这里感觉到有难度了,没见过的概念变多了,可能是之前c面对对象这个概念,好多没学到。到这里可能都是新知识了QAQ13.1.1 节练习练习13.1.1这个书上已经说的很明白了练习13.5class HasPtr{public: HasPtr(const std::string &s = std::string()): ps(new std::string(s)),i(0){}; HasPtr(const HasPtr&);原创 2020-06-20 20:45:15 · 103 阅读 · 0 评论 -
c++ primer 第12章课后练习 智能指针相关
感觉按一小节来写有点凑文章的感觉,试一下按一小章来写练习12.6using namespace std;vector<int> *init_vector();vector<int> *scan_vector(vector<int> *s);void print_vector(vector<int> *s);int main(){ auto s = init_vector(); scan_vector(s); print_v原创 2020-06-16 22:35:49 · 154 阅读 · 0 评论 -
C++ primer 10.3.2 10.3.3节练习 lambda相关
这一节主要说了lambda表达式,因为是第一次接触泛型和lambda还是记录下lambda表达式如下[capture list] (parameter list) -> return type {function body}练习10.14int main(){ auto sum = [](const int &a,const int &b)->int {return a+b;}; cout << sum(1,2);}练习10.15i原创 2020-06-11 19:41:00 · 167 阅读 · 0 评论 -
c++ primer 9.5.5节练习
练习 9.51在原题的基础上自己小拓展了一下,能够处理种类变多了。#include<iostream>#include<string>#include<vector>#include<cstdio>#include<map>#include<string>#include<set>#include<unordered_set>#include<unordered_map>usi原创 2020-06-08 02:09:26 · 190 阅读 · 0 评论 -
C++ 中迭代器失效问题
踩过的坑,记录一下insert和eraser操作会使迭代器失效,虽然这个网上已经有很多总结了,但我还是写一下吧insert操作在vector中会炸,而在list中不会,比如下面这个代码运行会直接炸int main(void) { vector<int> s{ 1,2,3,4,5,6,7,8 }; for (auto i = s.begin(); i != s.end(); ++i) { if (*i == 3) s.inse原创 2020-05-24 00:02:57 · 370 阅读 · 0 评论