c++
文章平均质量分 76
Never-SayNever
这个作者很懒,什么都没留下…
展开
-
C++多态虚函数表内存布局
假设有一个基类ClassA,一个继承了该基类的派生类ClassB,并且基类中有虚函数,派生类实现了基类的虚函数。我们在代码中运用多态这个特性时,通常以两种方式起手:(1) ClassA *a = new ClassB();(2) ClassB b; ClassA *a = &b;以上两种方式都是用基类指针去指向一个派生类实例,区别在于第1个用了new关键字而分配在堆上,第2个分配在栈上。请看上图,不同两种方式起手仅仅影响了派生类对象实例存在的位置。...转载 2022-07-08 10:56:53 · 714 阅读 · 0 评论 -
C++多线程同步
摘要:本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语:mutex, lock_guard, unique_lock, condition variable和semaphore等。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施!1. C++线程和基础同步原语Thread mutex, lock_guard, unique_lock con.翻译 2022-03-22 23:19:16 · 5167 阅读 · 1 评论 -
STL总结
STLSTL(Standard Template Library),即标准模板库,被容纳于C++标准程序库(C++ Standard Library)中,该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。STL的六大组件容器(Container),是一种数据结构,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;序列容器:每个元素都有固定位置,取决于插入时机和地点,和元素值无关。vector:vector是基于动态数组,内存空间是连续的,因此支持原创 2022-03-18 23:40:39 · 186 阅读 · 0 评论 -
C++基础笔记
32位系统不管是什么类型的指针,占用的内存都是4字节,寻址范围就是2的32次方,有4294967296个内存地址,4294967296个地址X8位空间=34359738368bit(位)/8=4294967296Byte/1024=4194304KB/1024=4096MB/1024=4G。是可能,不是一定,程序的表现是不稳定,增加了调试程序的难度。在C++11中,赋予了auto全新的含义,不再用于修饰变量,而是作为一个类型指示符,指示编译器在编译时推导auto声明的变量的数据类型。原创 2017-11-20 10:54:32 · 456 阅读 · 0 评论 -
文件操作与IO多路复用.md
select是通过描述符位图的方式监视文件描述符集合的可读写状态。调用select会阻塞直到有描述符就绪或超时,监视这些描述符,返回就绪的描述符集合。poll使用链表的数据结构监视描述符集合,可以更高效地监视大数量的描述符。epoll使用一个epoll实例来管理多个文件描述符,而不是直接操作文件描述符集合。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。C++中的输入输出都是建立在流的概念之上的。在上面的示例中,我们使用。原创 2023-08-10 11:21:03 · 196 阅读 · 0 评论 -
C++ /python/java /C# 自定义异常处理
http://www.runoob.com/C++ 实例finally 标准C++没有。您可以通过继承和重载 exception 类来定义新的异常。下面的实例演示了如何使用 std::exception 类来实现自己的异常:#include #include using namespace std;struct MyException : public exception转载 2017-03-27 18:03:57 · 448 阅读 · 0 评论 -
rust vs c++
【代码】rusr vs c++翻译 2023-02-20 11:07:12 · 146 阅读 · 0 评论 -
计算机的大小端存储
内存地址存储的最小数据大小就是字节,例如一个变量char temp的地址0x10000000,temp值为0x55,由于char类型只占用一个字节,那么temp变量就只占用0x10000000这个内存地址,不会占用其他内存地址,那假如变量是个int型呢?这里有几个概念:高地址,低地址,高位,低位,其中高地址,低地址是针对内存地址而言,高位,低位是针对数据类型的bit位的高低而言。当基本数据类型占用字节数超过了1字节后,大小端决定了数据按照什么顺序存储在内存里。大小端只针对基本数据类型。原创 2023-02-01 11:49:55 · 182 阅读 · 0 评论 -
aosp hal开发
aosp hal开发转载 2022-11-09 10:52:47 · 706 阅读 · 0 评论 -
Linux 设置线程名和打印线程ID
设置线程名和打印线程ID原创 2022-07-11 14:29:05 · 2156 阅读 · 0 评论 -
c++构造函数的使用
对于一般的类来说,如果不声明构造函数,则自动调用默认构造函数class A{public:A();};如果声明了另外一个构造函数,则会覆盖默认构造函数class A{public:A(int n){a=n};private:int a;};此时如果声明一个对象,则不可以直接A a;必须要A a(3);多数情况下,编译器为类生成一个默认构造函数,只有以下两种情况除外:一个类显式地声明了任何构造函数,编译器不再生成默认构造函数,除非设计者也显式声明了默认构造函数cl翻译 2022-07-07 23:02:49 · 463 阅读 · 0 评论 -
c++ 11 lambda 用法与原理
lambda也出现了好长时间,一直以来也仅仅限于使用,今天,借助此文,我们从使用、实现的角度聊聊lambda。在开始正文之前,我们先看一个问题,对下面的vector进行排序:std::vector<int>v={1,3,2};在C++11之前,我们可能会这么做(普通函数,即函数指针作为参数):boolCompare(inta,intb){returna<b;}intmain(){std::vector<int>...转载 2022-05-27 22:21:22 · 1007 阅读 · 0 评论 -
c++ 线程池
// 线程池线程个数缺省值#include <iostream>#include <vector>#include <queue>#include <unistd.h>using namespace std;const size_t NUM = 5;template <class T>class ThreadPool{public: // 构造函数,负责初始化成员变量和创建线程 ThreadPool(const siz翻译 2022-05-26 21:45:08 · 110 阅读 · 0 评论 -
c++ 11类型转化
C/C++是强类型语言,不同类型之间的相互转换是比较麻烦的.但是在编程实践中,不可避免的要用到类型转换.类型转换:隐式类型转换强制类型转换隐式类型转换提升精度,此种是编译器自动完成的,安全的.所以编译的时候不会有任何错误或者警告信息提示.示例:int ival = 3;double dval = 3.14159;// ival 被提升为 double 类型: 3.0ival + dval;降低精度,也是有编译器自动完成,会造成精度丢失,所以编译时得到一个警告信息提示.翻译 2022-05-25 22:25:11 · 1628 阅读 · 0 评论 -
c++ 右值引用 与std:move
左值与右值通常来说你确实可以使用一个值在表达式中的位置信息来判断这个值的左右值类型,比如说在下面这段代码中:int x = 10;int y = 20;int sum = x + y;最后一行当中,位于 " = " 左侧的sum就是一个左值,而右侧的 " x + y " 就是一个右值。除此之外,还可以用另外一种常用的方式来判断:可以取地址的,有名字的就是左值反之不能取地址,没有名字的就是右值比如在刚刚的代码的最后一行中,我们就可以对sum进行取地址操作,而不能对等号右侧的x+y进行取地址翻译 2022-05-25 21:03:18 · 407 阅读 · 0 评论 -
c++深浅复制
浅复制缺省复制构造函数:用一个对象的内容初始化另一个同类对象,也称为缺省的按成员拷贝,不是对整个类对象的按位拷贝。这种复制称为浅复制。”浅复制可能带来什么问题“class CGoods{ char *Name; //不同与char Name[21] ? int Amount; float Price; float Total_value; public:&翻译 2022-05-25 20:55:21 · 181 阅读 · 0 评论 -
c++ template
泛型初步由于C++是静态强类型语言,所以变量一经创建,则类型不得更改。如果我们希望创建一种应用广泛地复数类型,那么相应地需要基于int、float、double这些基础类型逐一创建,十分麻烦。泛型编程便是为了简化这一过程而生。能够容纳不同数据类型作为成员的类被成为模板类,其基本方法为在类声明的上面加上一行模板声明代码template<typename T>class myClass{};其调用过程为myClass<T> m;列举案例如下#include<iost翻译 2022-05-25 20:53:34 · 103 阅读 · 0 评论 -
协程:快速地实现高并发服务
零拷贝通过减少上下文切换次数,提升了文件传输的性能。事实上高并发服务也是通过降低切换成本实现的。如果你需要访问多个服务来完成一个请求的处理,比如实现文件上传功能时,首先访问 Redis 缓存,验证用户是否登陆,再接收 HTTP 消息中的 body 并保存在磁盘上,最后把文件路径等信息写入 MySQL 数据库中,你会怎么做?用阻塞API写同步代码最简单,但一个线程同一时间只能处理一个请求,有限的线程数导致无法实现万级别的并发连接,过多的线程切换也抢走了 CPU 的时间,从而降低了每秒能够处理的...转载 2022-04-17 14:27:48 · 689 阅读 · 0 评论 -
同步模型(synchronous IO)IO多路复用
同步模型(synchronous IO)IO多路复用网络应用需要处理的无非就是两大类问题,网络IO,数据计算。相对于后者,网络IO的延迟,给应用带来的性能瓶颈大于后者。网络IO的模型大致有如下几种:1: 同步模型(synchronous IO)阻塞IO(bloking IO)非阻塞IO(non-blocking IO)多路复用IO(multiplexing IO)信号驱动式IO(signal-driven IO)2: 异步IO(asynchronous IO)相对于同步IO,异步IO不是顺序执翻译 2022-04-16 15:38:17 · 467 阅读 · 0 评论 -
C++锁总结
锁:mutexmutex 独占的互斥量,不能递归使用 C++11timed_mutex 有超时功能的独占互斥量,不能递归使用 C++11recursive_mutex 递归互斥量,能递归使用 C++11recursive_timed_mutex 有超时功能的递归互斥量 C++11shared_timed_mutex 具有超时机制的可共享互斥量 C++14shared_mutex 共享的互斥量 C++17读写锁(std::shared_mutex)读写锁相比互斥锁,读写锁允许更高的并..原创 2022-03-22 23:12:59 · 3516 阅读 · 1 评论 -
IPC进程线程
进程进程:进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,是操作系统及进行资源分配和调度的基本单位。注意:一次任务的运行可以激活多个进程。进程是一个程序的执行的过程,是动态的,包括程序的创建、调度、消亡进程具有并发性、动态性、交互性、独立性等主要特性1.并发性:指的是系统中多个进程可以同时并发执行,相互之间不受干扰。——马路上两个汽车各跑各的,互不影响2.动态性:指的是进程都有完整的生命周期,而且在进程的生命周期内,进程的状态时不断变化的,进程具有动态的地址空间3.交互原创 2022-03-21 23:36:50 · 359 阅读 · 0 评论 -
现代c++ (3)
智能指针类引入:C/C++最为人诟病的是内存泄露问题,后来的大多数语言都内置了内存分配与释放功能,有的甚至对语言的使用者屏蔽了内存指针这一概念。这里对此不置褒贬,手动分配与释放内存有利有弊,自动分配与释放内存亦如此,这是两种不同的设计哲学。有人认为,内存如此重要,怎能放心将其交给用户去管理呢?另外一些人则认为,内存如此重要,怎能放心将其交给系统去管理呢?在C/C++中,内存泄露的问题一直困扰着广大开发者,因此各类库和工具也一直在努力尝试各种方法去检测和避免内存泄露,例如 boost,因此智能指针技术应原创 2022-03-20 13:54:40 · 699 阅读 · 0 评论 -
现代c++(2)
现代c++ 新特性C++11标准中,我们可以使用花括号(即{})对任意类型的变量,无论是局部变量还是类变量进行初始化,而且不用是static类型。*统一的类成员初始化语法 std::initializer_listenumerator enum class Color{ black, white, yellow }由于枚举值white对外部不可见(必须通过Color::white引用),所以可以定义一个同名的white变量。这种枚举变量被称为限定原创 2022-03-20 00:33:34 · 764 阅读 · 0 评论 -
现代c++(1)
现代c++RAII问题:先分配资源,再进行相关操作,在任意中间步骤出错时都对相应的资源进行回收,如果中间步骤没有出错,则在资源使用完毕后对其进行回收”。因为分配了堆内存,所以不释放会造成内存泄露。但是这样编写代码太容易出错了!我们必须时刻保持警惕,在任意出错的步骤中都要记得加上回收资源的代码。这样的编码方式不仅容易出错,还会导致大量的代码重复。解决这类问题方法:使用goto语句:使用 goto 语句后,一旦某个中间步骤出错,则跳转到统一的清理点进行资源清理操作。但是,我们总被告原创 2022-03-19 15:00:16 · 398 阅读 · 0 评论 -
Windows 调用Dll
windows 调用dlldll 两种链接方式 : 动态链接和静态链接(链接亦称加载)动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。 而静态链接就是把所有用到的函数全部链接到exe文件中。动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装原创 2017-04-29 21:23:29 · 612 阅读 · 0 评论 -
c/c++ static extern const
c/c++ static extern conststatic第一个作用:修饰变量静态全局变量,作用域仅限于变量被定义的文件中,作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的想要使用就得在前面再加 extern ***静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。即使这个函数运行结束,这个静态变量的值还是不会被销毁原创 2017-04-29 21:18:43 · 225 阅读 · 0 评论 -
C++继承和组合 重载、重写(覆盖)、隐藏
重载:同一访问区(如类中)内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。隐藏:派生类的函数屏蔽了它继承的基类同名函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。重写(覆盖):派生类中存在同基类中函数名,参数列表,返回值类型都一致的函数,且基类中该函数必须有virtual修饰,只有函数体不同(花括号内)。...转载 2017-03-29 15:49:36 · 874 阅读 · 1 评论 -
C++ STL 总结
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html一、一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极转载 2017-03-27 17:47:51 · 229 阅读 · 0 评论 -
MFC 总结(1)
一程序入口:class CSetupApp : public CWinApp{public: CSetupApp(); // 重载InitInstance(); public: virtual BOOL InitInstance();}MFC对这一系列的过程进行了封装。提供给编程人员的第一个裸露程序入口就是CWinApp的Ini原创 2016-09-07 23:36:41 · 332 阅读 · 0 评论 -
QT信号与槽实例
/* widget.h*/#ifndef WIDGET_H#define WIDGET_H#include <QLabel>#include <QLineEdit>#include <QPushButton>#include <QtGui/QWidget>#include <QGridLayout>#include <QString>#include<QMessageBox>cla原创 2017-05-09 14:31:17 · 429 阅读 · 0 评论 -
c/c++混合编程
c/c++混合编程1.C++调用C函数共有三个文件:1.h 1.c main.cpp[root@localhost aa]#cat 1.h#ifndef _1__H_#define _1__H_extern void print(char* );#endif[root@localhost aa]#cat 1.c#include <stdio.h>#include "1.h"v转载 2017-05-10 09:33:20 · 332 阅读 · 0 评论 -
C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现
https://blog.twofei.com/496/前言大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑定)/接口函数的基础. 可以说: 没有虚函数, C++将变得一无是处!既然是C++的精髓, 那么我们有必...翻译 2017-10-20 16:21:08 · 201 阅读 · 0 评论 -
静态绑定和动态绑定
https://www.cnblogs.com/AndyJee/p/4575670.html 对象的静态类型: 对象在声明是采用的类型,在编译期确定;对象的动态类型: 当前对象所指的类型,在运行期决定,对象的动态类型可以更改,但静态类型无法更改。静态绑定: 绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。动态绑定: 绑定的是对象的动态类型,某特性(比如函数)依转载 2017-11-16 11:50:07 · 236 阅读 · 0 评论 -
函数指针,二级指针,指针数组,函数指针的转换
#include <stdio.h>#include <string.h>char * fun1(char * p){printf("fun1:%s\n",p);return p;}char * fun2(char * p){printf("fun2:%s\n",p);return p;}char * fun3(char * p){printf(...原创 2018-04-08 17:10:14 · 220 阅读 · 0 评论 -
函数模版与类模版
#include<iostream>using namespace std;//template <class T>template <typename T>T my_min(T a, T b){ return (a>b?b:a);}int main(){ int a=1,b=2; char a1='c',b1='...转载 2018-04-17 11:44:45 · 148 阅读 · 0 评论 -
操作符重载
可重载的运算符列表:双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)关系运算符 ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于)逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)单目运算符 + (正),-(负),*(指针),&(取地址)...原创 2018-09-13 13:47:55 · 136 阅读 · 0 评论 -
MFC 总结(2)
四:调用dll1:dll 在不同目录:typedef DWORD (WINAPI*SETINFO)(LPCTSTR,LPCTSTR, LPCTSTR, DWORD, LPCTSTR, DWORD, DWORD); HMODULE hSetCom =NULL;SETINFO SetInfo =NULL;hSetCom =原创 2016-09-08 09:20:19 · 258 阅读 · 0 评论