C&C++记录学习
文章平均质量分 76
记录学习c/c++
StudyWinter
持续学习
展开
-
【c++】VSCode配置 c++ 环境(重新制作)
利用VS code和MinGW配置C++环境原创 2023-08-04 11:37:09 · 6643 阅读 · 19 评论 -
C++11新特性
C++11是 C++ 的第二个主要版本(前一个是 C++98 而后一个是C++17),并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。在它最终由 ISO 在 2011 年 8 月 12 日承认前,人们曾使用名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起,C++ 规则地每 3 年更新一次。原创 2023-07-28 10:59:57 · 966 阅读 · 0 评论 -
C++11特性之decltype
检查一个实体的声明类型或者检查表达式类型和值类别。翻译 2022-12-19 20:24:56 · 229 阅读 · 0 评论 -
C++11特性之auto
如果占位符类型说明符是或类型约束auto(从C++20开始),则使用函数调用中模板参数推导的规则从初始值中推导变量类型(有关详细信息,请参见模板参数推导-其他上下文)。如果占位类型说明符是 decltype(auto) 或者是受类型约束 decltype(auto) (从C++20 开始),那么推导出的类型是 decltype(expr),其中 expr 是初始值。从对应的实参推导它的类型。auto 说明符也可以用于后随尾随返回类型的函数声明符,此时返回类型是它的尾随返回类型(它也可以是占位符类型)。翻译 2022-12-16 21:16:43 · 646 阅读 · 0 评论 -
C++11特性
最近打算照着源文档学习C++特性,先从C++11的特性开始。翻译 2022-12-14 21:17:05 · 215 阅读 · 0 评论 -
【算法】求最小子集的和被5整除
【可以先预处理一波,所有数字先对5取余,得到的数字是在0-4范围内,然后再用5个桶,类似桶排序,把数字存起来,再进行判断(取余、存储我理解了,那么怎么和原数据进行对应的)】,我没有理解面试官后面的意思(苦笑),也没有顺着他的思路写出来。输入 S = {1,2,6,7,11, 12,13, 14, 17, 22}, 则输出 T = {1,14} 或 T = {2, 13}?我:我没有看面经,平时就刷题用用这些容器,使用时需要注意什么,使用时需要注意什么(我连说两遍),平时就是用,没注意到有什么。原创 2022-10-31 10:19:22 · 367 阅读 · 0 评论 -
C语言中函数只有声明没有定义可以调用吗
也就是说如果调用函数,则是发生在链接阶段,编译器会找相应的函数体,但是没有定义,所以找不到,即报【无法解析的外部符号 "int __cdecl sub(int,int)" (?如果不调用,则没事。(2)编译:检查语法错误,这里最耗时,将.i文件处理成.s文件(即汇编文件);(1)预处理:将宏展开,将注释删掉,将.c/.cpp文件处理成.i文件;(4)链接:将可重定位文件进行合并,得到最终的可执行文件。(3)汇编:将汇编文件处理成可重定位文件(.o);2 函数只有声明没有定义,调用它,程序不可运行。原创 2022-10-29 09:34:03 · 4023 阅读 · 0 评论 -
有符号/无符号整数相加溢出的判断方法
一个加数为正,另一个加数为负,或者任意一个加数为0时,不可能有溢出发生。的结果为非正时,发生了正溢出。的结果为非负时,发生了负溢出。,因此拿任何一个判断均可。转载 2022-10-28 17:33:36 · 1827 阅读 · 4 评论 -
用malloc动态申请一个二维数组
【代码】用malloc动态申请一个二维数组原创 2022-10-27 20:20:40 · 638 阅读 · 0 评论 -
Skip List--跳表(全网最详细的跳表文章没有之一)
跳表是可以实现二分查找的有序链表;每个元素插入时随机生成它的level;最底层包含所有的元素;如果一个元素出现在level(x),那么它肯定出现在x以下的level中;每个索引节点包含两个指针,一个向下,一个向右;(笔记目前看过的各种跳表源码实现包括Redis 的zset 都没有向下的指针,那怎么从二级索引跳到一级索引呢?留个悬念,看源码吧,文末有跳表实现源码)跳表查询、插入、删除的时间复杂度为O(log n),与平衡二叉树接近;转载 2022-10-27 17:04:27 · 840 阅读 · 2 评论 -
C语言程序内存分配中的堆和栈
(3)未初始化数据区(uninitialized data segment),也称BSS区(block started by symbol)(2)全局初始化数据区/静态数据区(initialized data segment/data segment)明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。分为代码区(text)、数据区(data)和未初始化数据区(bss)代码区、初始化数据区、未初始化数据区、堆区和栈区。(1)代码区(text segment)转载 2022-09-04 10:16:34 · 1733 阅读 · 0 评论 -
【算法】重载sort的cmp的题
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。(3)有交集的气球,更新终止位置,注意是去右边界的较小者,等到下次再和下一个气球判断,无交集,射出一支箭;原创 2022-09-03 17:57:27 · 398 阅读 · 0 评论 -
【c/c++学习】构造函数调用的次数问题
一道笔试题,遇到了好多次类似的,每次都感到困惑,然后做完也不求甚解下次继续不会。关于类在声明变量的时候,到底有没有实例化有没有调用构造函数的问题。转载 2022-08-30 22:29:20 · 1980 阅读 · 0 评论 -
inline与宏、函数之间的区别
(1)inline函数代码是被放到符号表中,使用时像宏一样展开,没有调用的开销效率很高;(2)inline函数是真正的函数,所以要进行一系列的数据类型检查;(3)inline函数作为类的成员函数,可以使用类的保护成员及私有成员;(1)内联函数在编译时展开,宏在预编译时展开;(2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;(3)内联函数有类型检测、语法判断等功能,而宏没有;(4)inline函数是函数,宏不是;(5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;转载 2022-08-25 15:31:25 · 218 阅读 · 0 评论 -
【c++容器】C++ STL容器如何解决线程安全的问题
对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了core dump。另外一种情况,如果是多个写方,并发的,也会导致core dump。当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。转载 2022-08-25 10:52:40 · 2693 阅读 · 0 评论 -
【c/c++学习】与或非的奇技淫巧
整理一下&、||、!的奇技淫巧。原创 2022-08-07 17:39:42 · 450 阅读 · 0 评论 -
leveldb安装
LevelDB是一个在Google编写的快速键值存储库,它提供了从字符串键到字符串值的有序映射。leveldb 库提供了一个持久的键值存储。键和值是任意字节数组。键在键值存储中根据用户指定的比较器功能进行排序。各方查资料才知道可能是缺少googletest和benchmark,一看,果然是。最近打算学习leveldb的源码,安装leveldb时遇到问题,记录一下。于是乎,去github的源码是看了眼,源码下是有文件的。法二:分别下载源码,将这两部分内容解压到对应的目录下。使用的代码调不出来。........原创 2022-08-06 19:06:07 · 1623 阅读 · 3 评论 -
【linux系统编程】linux下gdb调试方法与技巧整理
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;总的来说在Linux下开发程序gdb/cgdb是必须学会使用的,他的强大之处远不止于此,在程序的调试中用它会提高的我们的调试效率,当然gdb的功能与使用技巧还不止于此,多多探索,多多学习使用。参考链接httpslinux下gdb调试方法与技巧整理_花开蝶自来-liu的博客-CSDN博客_gdb调试httpshttps。...转载 2022-07-26 20:15:51 · 2706 阅读 · 0 评论 -
libevent库学习(2)
本次重点介绍bufferevent。很多时候,除了响应事件之外,应用还希望做一定的数据缓冲。比如说,写入数据的时候,通常的运行模式是(1)决定要向连接写入一些数据,把数据放入到缓冲区中(2)等待连接可以写入(3)写入尽量多的数据(4)记住写入了多少数据,如果还有更多数据要写入,等待连接再次可以写入这种缓冲lO模式很通用,libevent为此提供了一种通用机制,即bufferevent。带有buf的事件对象有两个缓冲区,一个读缓冲区,一个写缓冲区;】这一节的常规事件来记忆。...原创 2022-07-15 16:33:08 · 982 阅读 · 0 评论 -
大端字节序和小端字节序
在几乎所有的平台上,多字节对象都被存储为连续的字节序列。例如在 C 语言中,一个类型为的变量地址为,那么其指针的值为。且的四个字节将被存储在内存的位置。字节的排列方式有两个通用规则:举例:数字0x12345678小端模式中的存储方式为:大端模式中的存储方式为:那么问题来了,怎么判断机器是大端存储还是小端存储呢(1)使用强制类型转换 结果(2)使用联合体 结果...原创 2022-07-13 19:50:35 · 1194 阅读 · 0 评论 -
linux之线程
关于线程和进程的区别:进程和线程的详解和区别_StudyWinter的博客-CSDN博客_任务进程线程的区别(1)轻量级进程(light-weight process),也有 PCB,创建线程使用的底层函数和进程一样,都是 clone;(2)从内核里看进程和线程是一样的,都有各自不同的 PCB,但是 PCB 中指向内存资源的三级页表是相同的(下图区别进程)(3)进程可以蜕变成线程;(4)线程可看做寄存器和栈的集合;(5)在 linux 下,线程最是小的执行单位;进程是最小的分配资源单位线程概念:原创 2022-06-22 12:12:26 · 230 阅读 · 0 评论 -
c/c++中的宏
c/c++中宏的学习原创 2022-06-07 10:48:21 · 6851 阅读 · 0 评论 -
sizeof和strlen的区别
最近找实习,做到sizeof和strlen的选择题,考的很变态,今天总结一下知识点。1 sizeof运算符首先明确一点,sizeof是运算符(操作符),和【+、-、*、%】这些一样。所以它在编译期就已经计算好了。它的参数可以是数组、指针、类型、对象、函数等。它的功能:获得保证能容纳实现所建立的最大对象的字节大小。具体而言,当参数不同时,sizeof的返回值含义也不同:(1)数组:编译时分配的数组空间的大小;(2)指针:存储指针空间大小,和类型无关,只和机器有关(在32位机上站原创 2022-05-29 10:46:43 · 838 阅读 · 0 评论 -
孤儿进程和僵尸进程
Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。那么孤儿进程是什么呢?1 孤儿进程孤儿进程就是父进程先于子进程终止,这时子进程就是【孤儿进程】,会被init收养。先熟悉一个命令:查看进程状态ps ajx执行依次是父进程id、进程id、组进程id、会话进程id这里只要关注父进程id和进程id即可.原创 2022-05-28 16:27:46 · 249 阅读 · 2 评论 -
STL 容器迭代器失效总结
原迭代器指的是进行操作之前保存的迭代器,包括begin()、end()以及其他位置的迭代器。1 vector插入元素:(1)尾后插入push_back():size < capacity时,首迭代器不失效尾迭代失效(未重新分配空间),size == capacity时,所有迭代器均失效(需要重新分配空间)。(2)中间插入insert(iterator, n):中间插入:size < capacity时,首迭代器不失效但插入元素之后所有迭代器失效,size == capacity时原创 2022-05-27 10:19:32 · 231 阅读 · 0 评论 -
fork函数
案例1如下代码一共创建多少个进程(包含主进程)#include <sys/types.h>#include <unistd.h>int main(int argc, char* argv[]) { fork(); fork() && fork() && fork(); fork() || fork(); return 0;}测试一下加个getchar()查看进程状态ps ajx原创 2022-05-26 15:58:15 · 1938 阅读 · 2 评论 -
C++中的Lambda表达式详解
一段简单的Code#include<iostream>using namespace std; int main(){ int a = 1; int b = 2; auto func = [=, &b](int c)->int {return b += a + c;}; return 0;}基本语法简单来说,Lambda函数也就是一个函数,它的语法定义如下:[capture](parameters) mutable转载 2022-05-25 15:35:02 · 3056 阅读 · 0 评论 -
C++ STL 四种智能指针
0 前言C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述。shared_ptr 和 weak_ptr 则是 C+11转载 2022-05-24 11:06:37 · 172 阅读 · 0 评论 -
C++类大小详尽讲解
C++类的大小,是一个比较经典的问题,学过C++后,应该对类大小有清晰的认识,长话短说,本文精简凝练,我们进入正题!!!1 类的大小与什么有关系?与类大小有关的因素:普通成员变量,虚函数,继承(单一继承,多重继承,重复继承,虚拟继承)与类大小无关的因素:静 态成员变量,静态成员函数及普通成员函数2 空类空类即什么都没有的类,按上面的说法,照理说大小应该是0,但是,空类的大小为1,因为空类可以实例化,实例化必然在内存中占有一个位置,因此,编译器为其优化为一个字节大小。某类继承自空类:转载 2022-05-22 15:36:24 · 3647 阅读 · 4 评论 -
深入理解C++中四种强制类型转换的使用场景
1 C风格的强制类型转换C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换,使用格式如下:Type b = (Type)a;当然,C++也是支持C风格的强制类型转换的,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。2 C++风格的强制类型转换在C++中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast,用转载 2022-05-17 15:32:25 · 1274 阅读 · 0 评论 -
c++基本数据类型的大小及范围
1数据大小注意,c语言中没有bool类型,用0代表false,用非0代表true测试平台:VS2015的debug模式下X86#include <iostream>using namespace std;int main(int argc, char* argv[]) { cout << "sizeof(bool) = " << sizeof(bool) << endl; cout << "sizeof(char) = ".原创 2022-05-15 11:40:19 · 2820 阅读 · 0 评论 -
C++静态成员函数访问非静态成员的几种方法
大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即:class A{public: static void test() { m_staticA += 1; }private: static int m_staticA; int m_a;};此时你的test函数只能去访问m_st转载 2022-05-14 17:15:20 · 2870 阅读 · 0 评论 -
c++中拷贝构造函数被调用的时机
拷贝构造函数被调用的几种情况:(1)当用类的一个对象去初始化该类的另一个对象时,系统会自动调用拷贝构造函数;(2)将一个对象作为实参传递给一个非引用类型的形参,系统会自动调用拷贝构造函数;(3)从一个返回类为非引用的函数返回一个对象时,系统会自动调用拷贝构造函数;(4)用花括号列表初始化一个数组的元素时,系统会自动调用拷贝构造函数。下面逐个举例:1 当用类的一个对象去初始化该类的另一个对象时,系统会自动调用拷贝构造函数#include<ctime>#include原创 2022-05-14 10:54:02 · 5884 阅读 · 0 评论 -
【c/c++】程序编译过程
以下是一个 test.c 程序:#include <stdio.h>int main() { printf("hello, world\n"); return 0;}在 Unix 系统上,由编译器把源文件转换为目标文件gcc -o hello hello.c这个过程如下:(1)预处理阶段预处理器(cpp)根据以字符#开头的命令(directives),修改原始的C程序。比如hello.c中第一行的#include &l原创 2022-05-08 11:41:44 · 360 阅读 · 0 评论 -
【c++】c++内存分区
各种说法,但都有一定道理,只是划分角度或逻辑不同。1、三部分C++程序在执行时,将供用户使用内存大致划分为三个区域:(1)程序存储区:存放函数体的二进制代码,由操作系统进行管理;(2)静态存储区:静态存储区数据在程序开始就已经分配好了内存,执行过程中,它们所占的存储单元是固定的,在程序结束时就释放,所以该区数据一般为全局变量。(3)动态存储区:动态存储区数据是在程序的执行过程中根据需要动态分配和动态释放的存储单元。2、四部分C++程序在执行时,将供用户使用内存大致划分为四转载 2022-05-08 09:57:13 · 187 阅读 · 0 评论 -
【c++】volatile 关键字
volatile 的作用是什么呢?volatile 意思是易变的,是一种类型修饰符,在C/C++中用来阻止编译器因误认某段代码无法被代码本身所改变,而造成的过度优化。编译器每次读取 volatile 定义的变量时,都从内存地址处重新取值。这里就有点疑问了,难道编译器取变量的值不是从内存处取吗?并不全是,编译器有时候会从寄存器处取变量的值,而不是每次都从内存中取。因为编译器认为变量并没有变化,所以认为寄存器里的值是最新的,另外,通常来说,访问寄存器比访问内存要快很多,编译器通常为.转载 2022-05-08 09:39:27 · 114 阅读 · 0 评论 -
【c++学习】C++ 多态
1介绍这篇文章对多态做一个总结,同时对虚函数、纯虚函数、重载、覆盖、隐藏作相应的总结。1.1 定义如果有几个相似而不完全相同的对象,有时人们要求在向他们发出同一消息时,他们的反应各不相同,分别执行不同的操作,这种情况就是多态现象。C++所谓的多态是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是..转载 2022-05-06 11:34:01 · 80 阅读 · 0 评论 -
C++中NULL和nullptr的区别
在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。一、C程序中的NULL在C语言中,NULL通常被定义为:#define NULL ((void *)0)所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,转载 2022-05-04 10:22:02 · 1753 阅读 · 0 评论 -
c++对象模型
整理:侯捷老师的《面向对象高级编程》(下)理解对象模型,才能真正理解多态和动态绑定.1 成员函数和成员变量在内存中的分布下面程序在内存中的布局如下所示:class A {public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2();private: int m_data1; int m_data2;};class B : public原创 2022-04-25 14:54:35 · 1123 阅读 · 0 评论 -
【BUG】default argument given for parameter 2 of XXX
今天遇到这样一个问题。检查了半天,死活没找到逻辑错误,就查了一下。原来是因为我在函数的声明处和函数的定义处都指定了默认值,两处都指定的话,就是语法错误。【知识盲区】原因:编译器把这种情况作为非法处理的原因是:在声明和定义中如果指定了不同的默认值,编译器将无法判断采用哪个值作为参数的默认值。解决:任意去掉一个默认值就可以。...原创 2022-04-24 16:53:16 · 765 阅读 · 0 评论