C++
JMW1407
这个作者很懒,什么都没留下…
展开
-
Win7环境下VS2015安装+CUDA 10.0安装配置教程以及安装环境时遇到的一些问题
VS2015+CUDA 10.0安装配置教程VS2015+CUDA 10.0安装配置教程一、VS2015(社区版Community)安装教程1.1、 虚拟光驱的安装1.2、 VS2015的安装:最好不要在线安装1.2.1、 win7 安装VS2015出现“”安装包丢失或损坏”问题的解决办法:安装证书二、CUDA 在win7下的安装及配置2.1 安装前的准备2.2 安装过程2.3 测试Cuda是否安装成功2.4 配置环境变量2.5 CUDA安装成功后可能会出现的问题参考VS2015+CUDA 10.0安装配原创 2020-12-27 11:46:52 · 3294 阅读 · 1 评论 -
跳跃表(skiplist )详解及其C++编程实现
跳表SkipList跳表SkipList1、背景2、定义2.1、SkipList基本数据结构及其实现3、实现4、使用方法4.1、跳表的创建4.2、跳表插入操作参考跳表SkipList1、背景为什么选择跳表?目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。用跳表吧,跳表是一种随机化的数据结构,目前开源软件原创 2020-11-18 11:14:39 · 2853 阅读 · 4 评论 -
C++ 函数调用过程中栈区的变化——(栈帧、esp、ebp)
C++ 函数调用过程中栈区的变化C++ 函数调用过程中栈区的变化参考C++ 函数调用过程中栈区的变化参考1、https://blog.csdn.net/m0_38087936/article/details/829380062、https://blog.csdn.net/fang92/article/details/46494665?utm_source=blogxgwz3...原创 2020-10-11 10:28:05 · 7710 阅读 · 4 评论 -
C++ vector中resize()和reserve()区别
vector中resize 和 reserve区别resize 和 reserve区别1、reserve()避免多次不必要的扩容2、resize是改变容器的大小,且创建对象3、resize()和reserve()区别resize 和 reserve区别1、reserve()避免多次不必要的扩容成员方法功能capacity()告诉我们当前 vector 容器总共可以容纳多少个元素。如果想知道当前 vector 容器有多少未被使用的存储空间,可以通过 capacity()-size(原创 2020-10-09 16:29:32 · 15101 阅读 · 0 评论 -
C++中构造函数和析构函数常见面试题?
构造函数和析构函数常见面试题?构造函数和析构函数常见面试题?1、永远不要在构造函数或析构函数中调用虚函数2、为什么构造函数不能定义为虚函数3、为什么析构函数可以定义为虚函数4、构造函数的执行顺序?析构函数的执行顺序?5、构造函数的执行顺序?析构函数的执行顺序?参考构造函数和析构函数常见面试题?1、永远不要在构造函数或析构函数中调用虚函数#include<iostream>using namespace std;class Base{public: Base() { Fun原创 2020-10-02 08:06:42 · 1692 阅读 · 0 评论 -
C++类的虚函数表和虚函数在内存中的位置
C++类的虚函数表和虚函数在内存中的位置C++类的虚函数表和虚函数在内存中的位置参考C++类的虚函数表和虚函数在内存中的位置虚函数表位于只读数据段(.rodata),即:C++内存模型中的常量区;虚函数代码则位于代码段(.text),也就是C++内存模型中的代码区参考1、https://blog.twofei.com/496/2、https://blog.csdn.net/Lily_zhangrongli/article/details/106650195...原创 2020-09-21 09:30:19 · 5808 阅读 · 2 评论 -
深入浅出静态链接和动态链接
静态链接和动态链接静态链接和动态链接参考静态链接和动态链接参考1、https://blog.csdn.net/kang___xi/article/details/802107172、https://blog.csdn.net/u012662731/article/details/78520349原创 2020-09-20 08:34:10 · 559 阅读 · 0 评论 -
C++实现生产者和消费者模型
C++实现生产者和消费者模型 C++实现生产者和消费者模型1、实现细节1、单生产者-单消费者模型参考C++实现生产者和消费者模型1、实现细节具体的实现逻辑是构建一个queue来存储生产的数据,queue不满时可以生产,不空时可以消费。对于这个队列,采用阻塞队列的实现思路。先实现构造函数,初始化一个unique_lock供condition_variable使用。如何在类里面使用unique_lock等需要初始化,并且初始化会加锁的对象。这要研究下。我的理解是构造列表初始化,然后函数体里unl原创 2020-09-17 08:50:04 · 18364 阅读 · 10 评论 -
C++简单实现十进制和二进制、八进制、十六进制之间的转换
十进制到二进制、八进制、十六进制的转换十进制到二进制、八进制、十六进制的转换二进制、八进制、十六进制到十进制的转换十进制到二进制、八进制、十六进制的转换#include <iostream>#include <vector>using namespace std;int main(){ cout << "输入要转换的数字:" << endl; long n = 0; cin >> n; cout << "输入要原创 2020-09-11 07:50:03 · 2892 阅读 · 1 评论 -
C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)
const关键字const关键字1、什么是const2、使用原理2.1、const全局/局部变量2.2、cosnt修饰指针和引用2.3、const修饰函数参数2.4、const修饰函数返回值2.5、const成员函数和数据成员2.6、const修饰类对象3、const_cast的知识4、const与宏定义的区别5、Static与Const的区别参考const关键字1、什么是constconst是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性原创 2020-09-10 08:30:08 · 9903 阅读 · 6 评论 -
int i =1 是原子操作吗?i++是原子操作吗?
int i =1 是原子操作吗?i++是原子操作吗?int i =1 是原子操作吗?i++是原子操作吗?int i =1 是原子操作吗?i++是原子操作吗?原子操作(atomic operation)指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作原创 2020-09-08 08:59:05 · 4837 阅读 · 0 评论 -
C++ memcpy实现,考虑程序健壮性(对内存重叠进行解决)
C++ memcpy实现C++ memcpy实现参考C++ memcpy实现参考1、https://www.cnblogs.com/wangicter/archive/2012/08/31/4767300.html2、https://blog.csdn.net/qq_44842973/article/details/1073280013、https://blog.csdn.net/kang_tju/article/details/76151050...原创 2020-09-04 14:19:11 · 801 阅读 · 0 评论 -
C++如何在主函数(main)运行之前打印hello world
主函数(main)运行之前打印hello world主函数(main)运行之前打印hello world参考主函数(main)运行之前打印hello world主函数是永远是最先运行的函数,那么如果我们可不可以实现在主函数运行前在屏幕上打印一句话,比如“hello world”呢?要想做到这点,首先明确一件事:对于在全局作用域中定义的对象,它们的构造函数是在文件中所有其他函数(包括主函数)开始执行前被调用的,对应的,析构函数是在终止main之后调用的。方法一:全局变量的构造函数,会在main之前执原创 2020-08-31 08:48:22 · 917 阅读 · 0 评论 -
C++ 内存管理 —— 如何避免内存泄漏
内存泄漏1、什么是内存泄漏以及发生情况2、如何避免内存泄漏参考1、什么是内存泄漏以及发生情况1、定义wikipedia中这样定义内存泄漏:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。简单来说:内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由原创 2020-08-29 08:45:41 · 3338 阅读 · 1 评论 -
C++ 内存管理 —— 如何定位内存泄漏(valgrind)
定位内存泄漏(valgrind)定位内存泄漏(valgrind)1.1、基本概念1.2、使用方法参考定位内存泄漏(valgrind)1.1、基本概念应用环境:Linux编程语言:C/C++使用方法: 编译时加上-g选项,如 gcc -g filename.c -o filename,使用如下命令检测内存使用情况:#valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./filename就会看到内存使原创 2020-08-28 00:18:05 · 4990 阅读 · 0 评论 -
浅谈C++内存管理 —— 内存对齐
内存对齐内存对齐1、为什么要内存对齐2、什么是内存对齐3、实例说明4、#pragma pack(n)参考内存对齐1、为什么要内存对齐#include<iostream>using namespace std;struct A{ char a; int b; short c;};struct B{ short c; char a; int b;};int main(){ cout<<sizeof(A)<&原创 2020-08-27 08:06:33 · 278 阅读 · 0 评论 -
程序链接链的是什么?链接器通过什么进行的链接?为什么需要extern “C“?
程序链接程序链接1、链接链的是什么?2、链接器通过什么进行的链接?3、为什么需要extern "C"?参考程序链接源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→链接器(Linker)→可执行程序(executables)分配程序执行所需的栈空间、代码段、静态存储区、映射堆空间地址等,操作系统会创建一个进程结构体来管理进程,然后将进程放入就绪队列,等待CPU调度运行。1、链接链的原创 2020-08-26 08:24:58 · 1122 阅读 · 0 评论 -
操作系统的程序内存结构 —— data和bss为什么需要分开,各自的作用
操作系统的程序内存结构1、操作系统的程序内存结构1.1、程序编译运行过程1.2、程序的内存分布1.3、.data和.bss分开的理由1.4、程序的指令和数据分开原因:参考1、操作系统的程序内存结构1.1、程序编译运行过程源代码(source coprede)→预处理器(processor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→链接器(Linker)→可执行程序(executables)分配程序执行所需的栈空间、代码段、静态存储区、映射堆空原创 2020-08-25 07:53:58 · 5109 阅读 · 1 评论 -
C++ 序列化和反序列化
序列化序列化1、背景2、定义3、序列化评价指标4、序列化实例参考序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte。一个字节就是8个二进制位,8个Bit。二进制流和字节流本质上是一样的。对于我们编写的程序来说,它需要通过网络传输的数据是结构化的数据,比如,一条命令、一段文本或者一条消息。对应代码中,这些结构化的数据都可以用一个类或者一个结构体来表示。序原创 2020-07-07 15:04:16 · 16962 阅读 · 0 评论 -
C++类与类之间的存在的几种关系以及UML类图简单说明(依赖、关联、聚合、组合、泛化(继承)、实现)
类与类之间的关系以及UML类图1、类与类之间的关系1.1、定义和分类1.2、依赖关系(Dependency)1.2.1、定义1.2.2、使用( use a)1.2.3、实例1.3、关联关系(Association)1.3.1、定义1.3.2、使用1.3.3、实例1.4、聚合关系(Aggregation)1.4.1、定义1.4.2、使用(has-a)1.5、组合关系(Composition)1.5.1、定义1.5.2、使用1.6、泛化关系(Generalization)1.6.1、定义1.6.2、使用(is-原创 2020-07-06 23:13:30 · 8606 阅读 · 1 评论 -
C++ operator new、operator delete、operator new []、operator delete []
operator new、operator deleteoperator new、operator delete1、相关调用函数2、new operator 和 operator new3、delete operator 和 operator delete4、new[] 和 delete[]5、运行实例(placement new用法)6、new、delete的不同重载办法实例参考operator new、operator delete1、相关调用函数1、void* operator new(size原创 2020-06-19 22:09:07 · 954 阅读 · 4 评论 -
C++ 运算符重载:成员、非成员函数重载
C++ 运算符重载运算符重载1、背景2、运算符函数重载的两种形式1、成员函数重载1、定义格式2、非成员函数重载(友元)1、定义格式3、重载原则4、参数和返回值5、成员函数重载1、双目运算符重载1、定义2、调用格式2、单目运算符重载1、定义2、调用格式6、非成员函数(友元)重载1、定义2、定义形式3、调用格式4、重载原则:+和 -运算符的重载实例++和--运算符的重载:重载输入输出操作符<< >>string类实例(重载综合说明)参考运算符重载1、背景C++中标准运算符(如+、原创 2020-06-19 19:41:34 · 15003 阅读 · 5 评论 -
C++11中的std::function 和 std::bind
C++11中的std::function、std::bindstd::function1、定义2、原型说明:3、举例说明:std::bind1、定义2、函数原型3、std::placeholders4、举例说明:std::function#include < functional>1、定义在C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++11中,新增加了一个std:原创 2020-06-13 20:15:06 · 357 阅读 · 0 评论 -
C++ 11 Lambda表达式
C++ 11 Lambda表达式1. 背景2. 定义3. 语法归纳4. 应用举例1. 背景有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费。而且,定义函数对象类的地方和使用函数对象的地方可能相隔较远,看到函数对象,想要查看其 operator() 成员函数到底是做什么的也会比较麻烦。对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?Lambda 表达式能够解决这个问题。使用 Lambda 表达式可以减少程序中函数对象类的数量,使得程序更加优雅。2原创 2020-06-09 18:33:18 · 497 阅读 · 0 评论 -
C++中强制转换为static_cast, dynamic_cast,const_cast, reinterpret_cast
四种强制转换static_castconst_castreinterpret_castdynamic_cast(动态类型转换)static_caststatic_cast< new_type >(expression)该运算符把expression转换为new_type 类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:(1)用于基本数据类型之间的转换;如把int转换为char,把int转换成enum,但这种转换的安全性需要开发者自己保证(这可以理解为保证数据的精度原创 2020-06-08 21:04:13 · 403 阅读 · 0 评论 -
c++11之智能指针以及循环引用的解决
C++ 11之智能指针背景智能指针的引出实例unique_ptr、share_ptr、weak_ptrunique_ptr背景理解智能指针需要从下面三个层次:1、从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。2、智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决原创 2020-06-08 11:04:39 · 1256 阅读 · 0 评论 -
C++11右值引用:移动语义和完美转发
右值引用:移动语义和完美转发指针成员和拷贝构造函数移动语义指针成员和拷贝构造函数对C++程序员来说,编写C++程序有一条必须注意的规则,就是在类中包含了一个指针成员的话,那么就要特别小心拷贝构造函数的编写,因为一不小心,就会出现内存泄露。#include <iostream>using namespace std;class HasPtrMem{public: HasPtrMem():d(new int(0)) {} ///拷贝构造函数,从堆中分配内存,并用*h.d初始化原创 2020-06-07 21:35:00 · 769 阅读 · 3 评论 -
C++ 11的继承构造函数
C++ 11的继承构造函数1.概述2.注意事项参考文献1.概述C++是面向对象的基石,类具有可派生性。派生类可以自动获得基类的成员变量和接口,不过基类的非虚函数则无法再被派生类使用了。如果派生类要使用基类的构造函数,通常需要在构造函数中显示声明。例如:struct A{ A(int i){} };struct B : A { B(int i) : A(i) {}};B派生于A,B又在构造函数中调用A的构造函数,从而完成了构造函数的"传递"。struct A { A(int i转载 2020-06-05 21:28:37 · 576 阅读 · 0 评论 -
C及C++异常及处理方法,包括继承、构造、析构异常处理
C及C++异常及处理方法C语言错误处理方法1、返回值(if … else语句判断错误)2、errno(linux 系统调用)3、goto语句(函数内局部跳转)4、setjmp、longjmp5、assert.hC++ 异常程序错误1、异常语法2、异常抛出3、异常捕获4、异常传播5、栈展开C语言错误处理方法1、返回值(if … else语句判断错误)//源文件src、目标文件dst的打开、读取和写入伪代码int copy(const char* src,const char* dst){ open原创 2020-06-05 16:34:11 · 649 阅读 · 0 评论 -
C++多态
C++继承多态虚函数虚表指针object slicing 和虚函数抽象类和纯虚函数虚析构函数overload、override、overwrite多态定义:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。发出同样的消息,被不同类型的对象接收,可能导致不同的行为eg、动物的移动行为 Move,对于这一接口1、鱼在水中游2、鸟在天上飞;3、马在草原跑调用同名的函数导致不同的行为,以一致的观点看待从同一个类派生下来 的对象。减轻了分别设计的原创 2020-05-31 21:31:15 · 448 阅读 · 3 评论 -
C++ 继承关系及部分C++软件开发面试问题
C++继承继承继承和组合接口继承与实现继承公有、私有、保护继承继承和重定义不能自动继承的成员函数构造函数静态成员与继承转换与继承派生类到基类的转换基类到派生类的转换多重继承虚继承与虚基类虚继承的内存结构举例说明继承一个新类继承了原有类的属性和方法,并增加了自己的新属性和新方法,称之为派生类,派生类就继承了原有类(基类)。继承表达了对象的一般与特殊的关系。特殊类的对象具有一般类的全部属性和服务。(1)相关概念1、被继承的已有类称为基类(或父类)。2、派生出的新类称为派生类(或子类)。3、直接参与派原创 2020-06-02 15:01:16 · 699 阅读 · 1 评论