
C++
文章平均质量分 59
生活需要深度
这个作者很懒,什么都没留下…
展开
-
【C++深陷】之“decltype”
①作用于变量直接得到变量的类型;②作用于表达式,结果是左值的表达式得到类型的引用,结果是右值的表达式得到类型;当变量作为表达式时,返回的是该变量的一个左值形式(因为该表达式的结果可以作为赋值语句的左侧的值)。解引用运算符*作用于指针类型,得到了p指向的对象的左值(*p = 2很正确),p是指向int的指针,因此decltype(*p)得到的类型是int &。①当使用decltype(var)的形式时,decltype会直接返回变量的类型(包括顶层const和引用),不会返回变量作为表达式的类型。原创 2022-11-25 09:43:20 · 820 阅读 · 0 评论 -
C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及函数作为回调函数线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系线程也是一种资源,是受系统调度的。因此,你必须要让系统知道你的线程的起始位置,即线程函数的指针。Window系统的接口(原创 2022-11-07 14:37:23 · 487 阅读 · 0 评论 -
C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及函数作为回调函数线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系线程也是一种资源,是受系统调度的。因此,你必须要让系统知道你的线程的起始位置,即线程函数的指针。Window系统的接口(原创 2022-11-07 14:33:21 · 466 阅读 · 0 评论 -
C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及函数作为回调函数线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只是起了一个装饰的作用,所以二者并没有必然的关系线程也是一种资源,是受系统调度的。因此,你必须要让系统知道你的线程的起始位置,即线程函数的指针。Window系统的接口(原创 2022-11-07 14:31:17 · 332 阅读 · 0 评论 -
C++静态成员函数访问非静态成员的几种方法
如上,我整理了4种方法,当然方法还有很多,其实绕了这么大远路,我们的希望就是不破坏回调函数整洁的函数接口(加上自己的实例指针)而做的妥协,如果你更喜欢通过改变接口或者通过用Java类似的interface方式来实现,那也没有问 题,这里主要就是提供给大家一个思路,C++确实很灵活,我们要用好这把双刃剑 : )同学可能会问,这算什么问题?先简单说下回调,在座的应该都知道回调的含义,在C中回调主要体现就是回调函数,当然C++中也有仿函数等其他用法,抛开这些,单纯在回调函数这个点上我们进行如下讨论。原创 2022-11-07 14:29:23 · 1172 阅读 · 0 评论 -
线程回调 GNU Linux
---第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。换句话说,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么应该从返回值中减去 WAIT_OBJECT_0。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,这两个值的作用是很清楚的。----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。原创 2022-11-07 14:28:09 · 110 阅读 · 0 评论 -
Timer定时器 GNU linux
原文链接:https://blog.youkuaiyun.com/LearnLHC/article/details/125148736。timer_settime 设置 it_value 的值,不要 设置 it_interval。it_interval:第一次执行后,每隔 it_interval 执行一次。三、开始 定时器 - timer_settime。三、开始 定时器 - timer_settime。一、创建 定时器 - timer_create。原创 2022-11-07 14:26:45 · 1190 阅读 · 0 评论 -
C/C++随机生成字符串
std::mt19937接收一个unsigned int数作为种子。std::mt19937是伪随机数产生器,用于产生高性能的随机数。mt是因为这个伪随机数产生器基于Mersenne Twister算法。19937是因为产生随的机数的周期长,可达到2^19937-1。返回值为unsigned int。原创 2022-11-07 14:15:24 · 4294 阅读 · 0 评论 -
Boost
https://blog.youkuaiyun.com/caojinlei_91/article/details/79209362 文件拷贝。3.使用make命令单独生成regex,进入boost_1_37_0\libs\regex\build,选择合适的mak文件。在Library search path(-L)中写入:“BOOST/libs/regex/build/gcc”在eclipse中使用boost.Regex时,在Libraries(-l)中写入:“boost_regex”## Boost工具裁剪。原创 2022-10-12 14:21:47 · 233 阅读 · 0 评论 -
explicit/implicit详解 C++中
但是, 上面的代码中的_size代表的是字符串内存分配的大小, 那么调用的第二句 “CxString string2 = 10;首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).// 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码。原创 2022-10-10 19:50:09 · 1106 阅读 · 0 评论 -
Effective C++ 55个改善编程与设计的有效方法
std::function 这样的对象可保持任何可调用物质函数指针,函数对象,成员函数指针(而非仅函数指针)且具有一定的兼容性,可调用物的参数可以隐式转换为其function声明的参数以及返回值能隐式转换为 function声明的返回值 就可以兼容。shape_sptr 的静态类型是 shape 的智能指针, 因此缺省值是 shape的draw的缺省值,而非 rectangle 的draw的缺省值,C++ 坚持以这种夸张的方式来运作是基于运行期效率来做的。原创 2022-10-10 09:39:49 · 900 阅读 · 1 评论 -
概述 - C++11/14新特性
视频中不全面但较为深刻的整理了 C++11/14 的部分重要新特性,包括语言和标准库两部分,尤其是对新特性背后的原理进行分析。std::forward - 完美转发。可变参数模板 [重磅炸弹]explicit 关键字。=default 关键字。noexcept 关键字。override 关键字。decltype 关键字。容器 hashtable。unordered 容器。nullptr 关键字。lambda 表达式。原创 2022-09-15 19:02:24 · 448 阅读 · 1 评论 -
侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (二)
我们都是挖一大块内存,有需要的时候切出去,当我回收的时候它们的大小是相同的:比如我给ABC3个人,它们需要不同大小的内存,它们还给我的时候,如果还的大小是一样的,我就想办法把它管理在一起,而不要散落在原始的物理的那一部分,例如我们可以使用特殊的设计将它串在一起(如上图,将内存串接起来)。理论应该是#18 List进行供应,但因为现在这些链表都是空的,只有最后一个链表是有挂载page,所以第18号链表是空的,最后发现最后一个链表的page起着作用,所以在page中把130bytes切出去了)原创 2022-09-15 18:37:41 · 190 阅读 · 0 评论 -
侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (三)
当然,不同的平台main的参数是不同的,我们需要注意的是calling convention。我们可以查找到 _environ的首地址,,并且根据其指向的是指向字符串的指针,而字符串总是由‘\0’结束,四个字节为一个指针,因此,下图共有十个指针,需要注意的是其所指向的字符串的长度。之前都是VC6内部的相关内存分配。现在我们回到操作系统本身,之前我们对window的heap有了初步的了解,下面我们将进行一些实验来看看内部活动过程。这里的022D块相当于SBH的cookie,记录着本区块的大小。原创 2022-09-15 18:37:01 · 156 阅读 · 0 评论 -
侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (四)
其中的_file(2^11=2048)怎么解释呢?每个进程至少有三个file handle(stdin,stdout,stderr),接下来的动作就是把继承下来的这三个或更多的file handle抄录到struct ioinfo。在OS操作系统层面,Linux对应于FILE的是File Desriptor(fd),Windows对应的则是file handle。我们在编程时,只需要关注的时C语言层面的pointer to FILE,但是其与操作系统OS的fd或file handle有着一一对应的关系。原创 2022-09-15 18:36:20 · 555 阅读 · 0 评论 -
侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (一)
HeapAlloc:HeapAlloc是Windows提供的API,在进程初始化的时候,系统会在进程的地址空间中创建1M大小的堆,称为默认堆(Default Heap),该大小为默认值,可以通过/HEAP连接器开关进行修改。如果客户要的区块大小要小于sbh_threshold(size=1016,加上图中的上下的00000131(各占4个字节),1016+8=1024,即1K),将从sbh内部去申请内存。任何的c/c++程序,在main函数之前,有一个启动函数,你的main函数必须由启动码函数调用起来。原创 2022-09-15 17:57:42 · 612 阅读 · 0 评论 -
__builtin_memset的-Warray-bounds 警告
应该是编译器的bug,https://gcc.gnu.org/bugzilla/show_bug.cgi?O3优化时,for循环初始化,直接用memset代替了,导致出现bug。但具体啥原因,不清楚编译器咋造成的。用o2编译,没有任何问题。原创 2022-09-08 11:29:21 · 1406 阅读 · 0 评论 -
C/C++内存对齐
目录一、什么是内存对齐二、内存对齐的方式1、 采用#pragma pack(n)来对齐(1)指定一字节对齐#pragma pack(1)(2)指定两个字节对齐#pragma pack(2)2、结构体的对齐方式一、什么是内存对齐 首先我们先来了解一下为什么需要内存对齐,内存对齐的好处在哪里? 我们都知道在32位计算机中,int类型占据4个字节,double占据8个字节,char占据1个字节。下面代码void main(){ double Ser_double; int S原创 2022-08-13 10:57:12 · 307 阅读 · 0 评论 -
模块 - 单元测试类(一)
常见的单元测试类包含的有一个整体的文件原创 2022-07-09 18:55:14 · 138 阅读 · 0 评论 -
模块 - 时间类
时间处理函数的基本内容封装类结果原创 2022-07-09 18:53:51 · 109 阅读 · 0 评论 -
模块 - 日志系统 - Glog C++日志框架
Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种助手宏。可以使用google的glog开源库进行日志输出。工程如图:原创 2022-02-16 17:16:12 · 520 阅读 · 0 评论 -
SPDLOG 基本架构
SPD基本的架构进行一个说明原创 2022-02-13 13:53:10 · 443 阅读 · 0 评论 -
日志与常见框架
日志框架都有哪些C++ 中的日志框架有很多,其中比较著名的有: log4cxx:Java 社区著名的 Log4j 的 C++ 移植版,用于为 C++ 程序提供日志功能,以便开发者对目标程序进行调试和审计。 log4cplus:一个简单易用的 C++ 日志记录 API,它提供了对日志管理和配置的线程安全、灵活和任意粒度控制(也基于 Log4j)。 Log4cpp:一个 C++ 类库,可以灵活地记录到文件、syslog、IDSA 和其他目的地(也基于 Log4j)。原创 2022-05-17 22:28:06 · 1291 阅读 · 0 评论 -
驼峰式与下划线命名规则
编码规则原创 2022-07-06 10:24:11 · 7477 阅读 · 0 评论 -
C/C++ Google Style编码格式
C与C++语言编码规范原创 2022-06-15 16:06:16 · 284 阅读 · 0 评论 -
正则表达式
在C++中正则表达式需要用到regex库:常用函数:函数名称 解释regex_match 将一个字符序列与正则表达式进行匹配regex_search 查找字符序列中与正则表达式匹配的结果,找到第一个之后就会返回结果并停止查找regex_replace 替换字符到正则表达式匹配到字符序列的位置。检验邮箱格式:邮箱的一般格式:xxx@xxx.com,验证 xxx@163.com 格式的邮箱。正则表达式:[[:graph:]]+@163[.]com,这里将.用方括号括起来是因为.在原创 2022-06-18 17:31:02 · 148 阅读 · 0 评论 -
Conan——C++包管理工具
Conan——C++包管理工具——使用踩坑记录使用conan所遇到的大部分问题都可以在conan官方文档中找到答案,参考官方文档地址:https://docs.conan.io/en/latest/虽然大多数情况下,答案不是那么显然。不过也正是如此,本文把那些可能有点绕的问题的解决办法和原理,尽可能详细的记录下来,以便后人遇到相同问题时能节省一点定位的时间。创建一个包的最简步骤1. conan new 生成一个conanfile.py2. 编辑conanfile.py一般的,原创 2022-05-28 10:18:19 · 2603 阅读 · 0 评论 -
std::pair std::tuple std::tie
tuple即元组,可以理解为pair的扩展,可以用来将不同类型的元素存放在一起,常用于函数的多返回值。定义与初始化tuple可以使用初始化列表进行赋值。tuple<int,double,string> t3 = {1, 2.0, "3"};1访问可以使用get<常量表达式>(tuple_name)来访问或修改tuple的元素(返回引用)get<0>(t3) = 4;cout << get<1>(t3) <&l原创 2022-05-21 18:18:06 · 1534 阅读 · 0 评论 -
std::enable_shared_from_this 智能指针
今天我说一下我的理解。我有一个需求,在类内部保留一个引用,即把自己的智能指针传递给其他的类:1)在类的内部是不能二次使用shared_ptr来引用自己的,这样会循环引用无法释放;2)这样就是内部需要一个weak_ptr来引用自己,但是这个值如何初始化是个问题:因为不能使用类似下面的语句直接初始化,weak_ptr<A> weak = this;但是,如果类从std::enable_shared_from_this继承了,就可以了:weak_ptr<A> co原创 2022-05-21 14:24:37 · 1451 阅读 · 0 评论 -
T&& 右值引用
左值与右值左值:表达式结束后仍存在的持久对象;右值:表达式届时后就不再存在的临时对象。包括将亡值和纯右值。将亡值:T&&函数返回值,std::move返回值,将要被移动的对象等。纯右值:非引用返回的临时变量,运算表达式产生的临时变量,原始字面量和lambda表达式等右值引用的作用让被引用的右值“重获新生”,其生命周期和右值引用类型变量的生命周期一样,不会被马上析构掉。struct A{ A() { cout << "construct: " <&..原创 2022-05-20 21:14:36 · 692 阅读 · 0 评论 -
std::optional
一、前言 有时我们会用一个值来表示一种“没有什么意义”的状态,这就是C++17的std::optional的用处。 在编写程序时,我们常常遇到一种情况,那就是我们不总是有一个固定值来表示一个事物。例如,找出文本中的第一个偶数(如果存在的话)。或者一个类有一个可选的成员函数,即一个不是总需要被设置的成员函数。在以前的代码中,这些情况一般使用魔术值(magic value)或者空指针(null pointers)来表示。一个魔术值可以是一个空的字符串、0、-1或者一个最大的非负值(例如std::st原创 2022-05-20 19:20:21 · 7617 阅读 · 1 评论 -
__declspec(dllimport)与__declspec(dllexport)
是时候总结一下__declspec(dllimport)的作用了。可能有人会问:__declspec(dllimport)和__declspec(dllexport)是一对的,在动态链接库中__declspec(dllexport)管导出,__declspec(dllimport)管导出,就像一个国家一样,有出口也有进口,有什么难理解的呢?这是一种很自然的思路,开始我也是这样理解。 但是在两年前的一个项目中,我发现不用__declspec(dllimport)似乎也可以。比如现在我新建一...原创 2022-05-17 22:04:49 · 958 阅读 · 0 评论 -
操作系统标准接口设计POSIX
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。操作系统标准-POSIX--------------------------------------------------------------原创 2022-05-07 16:40:54 · 4287 阅读 · 0 评论 -
direct.h头文件POSIX标准
是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir()函数、readdir()函数。chdir()改变当前目录的函数原形:int chdir(const char *path)功能:把由path指定的目录改为当前目录。path参数中可以指定驱动器号,如“a:\\ddd”, 但只是改变该驱动器上的当前目录,对当前活动驱动器上的当前目录无影响。返回值:0(成功);-1(失败)头文件:dir.h=======================原创 2022-05-07 16:35:05 · 1089 阅读 · 0 评论 -
unistd.h头文件POSIX标准
C语⾔中access_access函数的使⽤实例详原创 2022-05-07 15:29:06 · 2858 阅读 · 0 评论 -
大小端,字节序,位序,字节对齐,位域对齐
测试用源代码:#include<stdio.h>#include<string.h>#if 1struct Test{ unsigned short a:2; unsigned short b:3; unsigned short c:5; unsigned short d:8;};#elsestruct Test{ unsigned char a:2; unsigned char b:3; unsigned c...原创 2022-05-06 16:52:19 · 491 阅读 · 0 评论 -
std::ratio分数计算
std::ratio代表一个比例,或者说比率。其实就是将给定的两个整数分别除以它们的最大公约数得到一个分数(分子及分母)。其定义为type definition description yocto ratio<1,1000000000000000000000000> 10-24* zepto ratio<1,1000000000000000000000> 10-21* atto ratio<1,1000000000...原创 2022-05-06 14:56:40 · 606 阅读 · 0 评论 -
时间编程Chrono库 - C++11
chrono库主要包含了三种类型:时间间隔Duration、时钟Clocks和时间点Time point。原创 2022-05-06 12:02:00 · 7049 阅读 · 0 评论 -
时间编程ctime - C/C++
c++ time函数_C++的日期和时间函数C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime>头文件。有四个与时间相关的类型:clock_t、time_t、size_t 和tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下:#ifndef _TM原创 2022-05-05 17:54:56 · 4150 阅读 · 0 评论 -
windows临界区
// project4.cpp: 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <vector>#include <map>#include <string>#include <thread>#include <list>#include <mutex>#include <future>#include &.原创 2022-05-04 17:52:05 · 163 阅读 · 0 评论