
C++
文章平均质量分 75
Hello:CodeWorld
走过大半个中国去睡你、
展开
-
C++ std:: shared_ptr, std::unique_ptr 智能指针
https://www.cnblogs.com/keye/p/17901921.html原创 2024-07-27 10:07:47 · 633 阅读 · 0 评论 -
C++ 关于std::vector 的拷贝和赋值
包含std::vector 的结构体直接赋值是可以的,不存在浅拷贝的问题。vector 调用赋值运算符时候,新的vector 会重新申请一块堆内存来存放元素数据,原来的vector 的堆内存释放或者修改不会对新的vector 有影响。对象中的对象会指向同一个内存地址,这可能会导致问题,如违反对象唯一性原则、指针悬挂等。为了解决浅拷贝的问题,你需要进行深拷贝。包含指针或其他需要深度拷贝的对象,则在拷贝后和原始。有自己的拷贝构造函数进行深拷贝,可以直接使用。时,实际上发生的是浅拷贝,即只拷贝了。原创 2024-07-27 09:50:51 · 1547 阅读 · 0 评论 -
inline在c++中的作用
内联函数并不是一个增强性能的灵丹妙药。只有当函数非常短小的时候它才能得到我们想要的效果。但是,如果函数并不是很短而且很多地方被调用的话,那么将会使得可执行程序体积增大。所以。转载 2024-06-14 13:44:06 · 192 阅读 · 0 评论 -
C++ 关于override关键字使用详解
因此,只要函数签名相同,派生类的函数就可以覆盖基类的函数,无论这两个函数的实现是否相同。这就是前面所说的,普通虚函数同时继承接口和缺省实现是危险的,最好是基类中实现缺省行为 (behavior),但只有在派生类要求时才提供该缺省行为.一种方法是 纯虚函数 + 缺省实现,因为是纯虚函数,所以只有接口被继承,其缺省的实现不会被继承。这是因为非虚函数是 “静态绑定” 的,p1被声明的是 Person* 类型的指针,则通过 p1调用的非虚函数都是基类中的,既使 指向的是派生类。转载 2024-05-31 18:06:20 · 10769 阅读 · 2 评论 -
为什么局部变量是线程安全的?
例如,在Java 5.0之前,Integer.toString()方法使用ThreadLocal对象来保存一个12字节大小的缓冲区,用于对结果进行格式化,而不是使用共享的静态缓冲区(需要使用加锁机制)或者每次调用时都分配一个新的缓冲区。当调用fibonacci(a)时,CPU要先找到方法fibonacci()的地址(在CPU堆栈寄存器中),然后跳转到这个地址去执行代码(蓝色线),最后CPU执行完方法,再返回原来调用方法的下一条语句(红色线)。即,栈帧和方法同生共死。方法A中调用方法B,方法B中调用方法C。转载 2024-04-30 16:48:40 · 62 阅读 · 0 评论 -
使用std::copy_n 对std::vector 拷贝数据时需要注意
关于第二个参数size,需要注意,这个iterator 所指向的容器的元素个数,比如这里是std::vector,std::array 等,这里需要调用的是size()这个接口,返回的是元素个数,而不是多少个Byte.关于第一和第三个参数,这里需要注意是用的iterator。原创 2024-04-30 15:38:31 · 830 阅读 · 0 评论 -
c++ std::enable_if的用法
首先gt_zero是一个模板函数,typename std::enable_if::type是函数的返回值类型,std::enable_if一般是由两部分组成,第一个参数是一个判定式,当判定式为真时,std::enable_if::type的这个type数据成员存在,且值为bool,如果没有第二个参数,则默认值为void。功能:检查 T 是否为整数类型。转载 2024-04-21 15:35:45 · 147 阅读 · 0 评论 -
C++ std::tuple总结
C++11引入了一个新的较实用的模板类型,std::tuple,也即是元组。元组是一个固定大小的不同类型(异质,heterogeneous)值的集合,也即它可以同时存放不同类型的数据。类似于python中用小括号表示的元组类型。C++已有的std::pair类型类似于一个二元组,可看作是std::tuple的一个特例,std::tuple也可看作是std::pair的泛化。std::pair的长度限制为2,而std::tuple的元素个数为0~任意个。转载 2024-04-21 15:16:52 · 352 阅读 · 0 评论 -
[C++]虚析构函数的作用
C++中的虚析构函数到底什么时候有用的,什么作用呢。转载 2024-04-14 11:27:12 · 199 阅读 · 0 评论 -
C++ Perf性能调优+火焰图调优
系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。转载 2024-03-31 11:30:07 · 463 阅读 · 0 评论 -
C++20中的span容器
span 是 C++20 中引入的一个新的标准容器,它用于表示连续的一段内存区间,类似于一个轻量级的只读数组容器。span 是一个轻量级的非拥有式容器,它提供了对连续内存的引用。span 的主要用途是作为函数参数,可以避免不必要的内存拷贝,并且可以防止悬垂指针和空指针引用的问题。它的定义在头文件 <span> 中,并位于 std 命名空间中。span 包含了一个指向连续内存区域的指针以及它所占用的大小,可以通过它来访问这个内存区域中的元素。转载 2024-03-24 10:49:59 · 738 阅读 · 0 评论 -
详解 C++ 左值、右值、左值引用以及右值引用
区分左值和右值,终究还是要看能否取地址。左值引用只能引用左值,不能直接引用右值。但是const左值引用既可以引用左值,也可以引用右值。// 1.左值引用只能引用左值int t = 8;// 编译报错,因为10是右值,不能直接引用右值// 2.但是const左值引用既可以引用左值// 也可以引用右值问:为什么const左值引用也可以引用右值?答:在 C++11标准产生之前,是没有右值引用这个概念的,当时如果想要一个类型既能接收左值也能接收右值的话,需要用const左值引用。转载 2023-12-23 18:58:11 · 598 阅读 · 0 评论 -
Mordern C++之左值(引用)与右值(引用)
std::move 和 std::forward对比转载 2023-12-22 17:22:59 · 116 阅读 · 0 评论 -
C++STL vector容器 基本概念 构造函数 赋值操作 容量和大小
———重新指定容器的长度为num,若容器变长,则以elem值填充新位置。————————————将[beg, end)区间中的数据拷贝赋值给本身。————————–判断容器是否为空,空返回true,不为空返回false。————————————-将n个elem拷贝赋值给本身。—————————构造函数将n个elem拷贝给本身。—————————–返回容器中元素的个数,capacity≥size。——————————采用模板实现类实现,默认构造函数。————————容器的容量,capacity≥size。转载 2023-12-17 15:28:10 · 286 阅读 · 0 评论 -
C++ 右值引用初始化和赋值
C++ 右值引用初始化和赋值原创 2023-02-12 15:05:24 · 520 阅读 · 1 评论 -
C++ 11 decltype 和decltype(auto)
decltype 和decltype(auto)转载 2022-06-26 14:10:36 · 499 阅读 · 0 评论 -
C++构造函数的default和delete
C++构造函数的default和delete转载 2022-06-22 15:06:49 · 2148 阅读 · 0 评论 -
std::vector和std::array以及内置数组效率的比较
处理大规模数据的时候,尽量用数组,而不要用vector。vector虽然方便,但效率实在太低了,数据规模越大,就越能体现出它的效率之低。实验验证:1.循环2亿次,每次循环进行2次vector的访问,打印运行时间:运行时间:2.将vector改为数组,同样,每次循环进行2次数组的访问,打印运行时间:运行时间:还没算上a++的运行时间,效率竟已相差25倍!如果算上a++的运行时间和while循环的跳转时间,这个倍数还会变得更大。由此可见,数组的效率 > ...转载 2022-05-23 22:08:39 · 1721 阅读 · 0 评论 -
vector,map以及list性能对比
虽然说map是关联容器,一般关联的数据都使用map来存储,但是实际上vector或者list也是可以代替这样的功能。具体实现可以看vector或list保存结构体或对象时的查找方法_宇龍_的博客-优快云博客比如vector保存一个结构体:struct stData{ int key; int value;}又或者用vector或者list保存pair对象,再通过std::find或者std::find_if来查找值即可实现和map一样的效果,虽然查找速度不如ma...转载 2022-05-23 21:49:43 · 2269 阅读 · 0 评论 -
C++11: 右值引用,move语义和std::forward的理解
引言:乍看起来,move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得你可以将传来的任意参数转发给 其他函数,而右值引用使得move语义和完美转发成为可能。然而,慢慢地你发现这不那么简单,你发现std::move并没有move任何东西,完美转发也并不完美,而T&&也不一定就是右值引用……move语义最原始的左值和右值定义可以追溯到C语言时代,左值是可以出现在赋值符的左边和右边,然而右值只能出现在赋值符的右边。在C++里,这种方法作为初步判断左值或右值还是可以的转载 2022-05-22 16:35:46 · 323 阅读 · 0 评论 -
【C++】atomic简介
atomic简介C++11起提供了atomic,可以使用它定义一个原子类型。原型:template< class T >struct atomic;成员函数:atomic提供了一些与原子操作有关的成员函数。成员函数 说明 store 原子地以非原子对象替换原子对象的值 load 原子地获得原子对象的值 详见:https://zh.cppreference.com/w/cpp/atomic/atomic特化成员函数:所谓特化函...转载 2022-05-22 12:27:36 · 7517 阅读 · 0 评论 -
static和inline在C++头文件中的使用
先上例子:// foo.hpp#ifndef FOO_HPP#define FOO_HPPvoid foo(){ //}#endif// a.cpp#include "foo.hpp"void func_a(){ foo();}// b.cpp#include "foo.hpp"void func_b(){ foo();}// main.cppextern void func_a();extern void func_b();int...转载 2022-05-22 10:48:44 · 1184 阅读 · 0 评论 -
C++11 constexpr和const的区别详解
我们知道,constexpr 是 C++ 11 标准新添加的关键字,在此之前(C++ 98/03标准)只有 const 关键字,其在实际使用中经常会表现出两种不同的语义。举个例子:#include <iostream>#include <array>using namespace std;void dis_1(const int x){ //错误,x是只读的变量 array <int,x> myarr{1,2,3,4,5}; co...转载 2022-04-30 21:29:14 · 341 阅读 · 0 评论 -
函数传参用pass-by-reference 还是pass-by-value好
并不是所有的场景都适用“pass-by-reference 比pass-by-value好”,有几种场景是正好相反的,甚至有些场景是必须要pass-by-value的。下面就来大致说明一下。目录一. pass-by-pass 比pass-by-reference好的场景1. 对于内置类型对象,2. 对于STL迭代器3. 对于函数对象二.pass-by-reference比pass-by-value好的场景三. 必须返回对象时,别妄想返回其r...原创 2022-04-10 10:59:32 · 791 阅读 · 0 评论 -
C++ move()函数
目录1. 左值和右值的概念2. 引用3. 左值引用和右值引用 3.1 左值引用 3.2 右值引用1. 左值和右值的概念要了解move函数首先弄清左值引用和右值引用。左值、左值引用、右值、右值引用 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体; 右值当在赋值号右边取出值赋给其他变量的值;右值可以在内存也可以在CPU寄存器。 一个对象被用作右值时,使用的是它的内容(值),被当作...转载 2022-01-08 18:17:38 · 9013 阅读 · 1 评论 -
C++之Lambda表达式
1. 概述C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}可以看到,Lambda 主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable 或 exception 声明、-> 返回值类型、{函数体}.2. Lambda 语法分析2.1 [函数对象参数]标识一个 Lam转载 2022-01-08 18:11:48 · 644 阅读 · 0 评论 -
C++11新特性之decltype关键字的使用
一.decltype关键字介绍decltype关键字与auto关键字相似,但又有不同之处;auto关键字是在编译时通过已经初始化的变量来确定auto所代表的类型。换句话说,auto修饰的表达式必须是已经初始化的变量;那么如果我们只是想得到此变量的类型,那又该如何做呢?这个时候就轮到decltype出场了,decltype关键字也是用来在编译时推导出一个表达式的类型,但此表达式初始化与否,在编译器都没有多大的影响。下面是使用关键字decltype关键字的示例:#include <iostr转载 2022-01-08 18:03:33 · 635 阅读 · 0 评论 -
C++ if和if constexpr
template <typename T>struct has_foo { template <typename C> static constexpr std::true_type test(decltype(&C::foo)) { return {}; } template <typename C> static constexpr std::false_type test(...) { return {}; } static c...转载 2022-01-08 17:51:27 · 1080 阅读 · 0 评论 -
C++17 新特性 constexpr if——按条件编译
C++17新特性中,constexpr if为我们提供了按条件编译的功能。它可以在编译阶段,根据模板参数的值编译相应的段落。与普通的if相比,好处是避免生成多余的if…else…条件判断分支,影响效率。坏处是会使生成的文件变大(下面的例子中将编译出两个版本的函数fun)vector<int> *ptr1 = new vector<int>{1, 2, 3};vector<int> *ptr2 = new vector<int>{4, 5, 6};t转载 2022-01-08 17:50:40 · 759 阅读 · 0 评论 -
c++中template 模板函数的用法(基础)
参考:C++ Template 基础篇(一):函数模板_lezardfu的专栏-优快云博客_模板函数参考:c++中template的用法_zhong29的博客-优快云博客_c++ template用法目录1. 为什么要有泛型编程2. 函数模板定义2.1 普通函数模板2.2 成员函数模板2.3 为什么成员函数模板不能是虚函数(virtual)?3. 实参推断3.1 如何使用3.2 当返回值类型也是参数时3.3 实参推断时的自动类型转换4.0 函数模板重载..转载 2022-01-08 15:31:53 · 1471 阅读 · 0 评论 -
c++中 static 变量和函数能否被子类继承
1. 父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点在利用static变量进行引用计数的时候要特别注意。 2. static函数没有“虚函数”一说。因为static函数实际上是“加上了访问控制的全局函数”,全局函数哪来的什么虚函数? 3. 派生类的friend函数可以访问派生类本身的一切变量,包括从父类继承下来的protected域中...转载 2021-08-01 19:00:52 · 770 阅读 · 0 评论 -
C++---继承(父类和子类构造和析构顺序)
继承方式1、公共继承(public)2、保护继承(protected)3、私有继承(private)注意:父类中的私有成员子类以任意方式继承都不能访问例:# include<iostream>using namespace std;//父类class Base{public: int m_a;protected: int m_b;private: int m_c;};//以public方式继承的子类class Base_son :p转载 2021-08-01 18:37:48 · 1778 阅读 · 0 评论 -
C++ 函数模板和类模板--泛型编程
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。一 函数模板初识1) 为什么要有函数模板?函数业务逻辑一样,但是函数参数类型不一样,引入泛型编程,方便程序员编程。2) 语法:template <typename T>void myswap(T &a,T &b){}a: tempalte是告诉C++转载 2021-08-01 16:08:27 · 191 阅读 · 0 评论 -
C++ -- 默认函数与default和delete用法
先列举C++中的默认函数:默认成员函数:1.默认构造函数;2.默认析构函数;3.拷贝构造函数;4.拷贝赋值函数;5.移动构造函数;6.移动拷贝函数;默认操作符函数:1.operator;2.operator&;3.operator&&;4.operator*;5.operator->;6.operator->*;7.operator new;8.operator delete;客户程序显示定义默认函数:C++规定一旦客户程序代码中转载 2021-08-01 10:27:13 · 302 阅读 · 0 评论 -
C++: explicit的适用场合以及为什么要使用explicit
explicit是个C++关键子,但是关注过它的人远远没有其他关键字的多,但是往往忽略了它,就会在一些不经意的地方造成错误,而花费更多的时间去寻找.看下下面这个例子:#include <iostream>using namespace std;class A{public: A(int i = 5) { m_a = i; }private: int m_a;};int main(){ A s; //我转载 2021-08-01 10:16:08 · 159 阅读 · 0 评论 -
c++ string最大长度_关于C++ std::string类内存布局的探究
一切要从探讨指针的类型说起。运行环境:Ubuntu 20.04.1 LTS 64-bit预先准备:调整字节对齐单位为1,防止为4时因填充导致人脑判断失误#pragma pack(1)01—缘起:指针的类型《深入探索C++对象模型》里面有提到不同类型的指针之间的不同。对于一个自定义的class,一个指向它的指针和一个指向int型整数的指针有何不同呢?从内存的角度来看,没有什么不同!为什么?来看一个很简单的程序:cout << "sizeof(int) = " &转载 2021-07-31 22:58:49 · 4890 阅读 · 0 评论 -
C++中的模板template <typename T>
这个是C++中的模板..template<typename T> 这个是定义模板的固定格式,规定了的..模板应该可以理解到它的意思吧.. 比如你想求2个int float 或double型变量的值,只需要定义这么一个函数就可以了,假如不用模板的话,你就必须针对每种类型都定义一个sum函数..int sum(int, int);float sum(float, float);double sum(double, double);1.因为T是一个模版实例化时才知道的类型,所以编译器更对T不转载 2021-07-01 22:06:44 · 1456 阅读 · 0 评论 -
C++ 强制类型转换
首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分. 隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。int ival = 3;double dval = 3.14159;ival + dval;//ival被提升为double类型2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的转载 2021-06-29 22:53:48 · 1152 阅读 · 0 评论 -
C++ 左值引用和右值引用
1. 左值和右值引用的定义左值引用实际上是一种隐式的指针,它为对象建立一个别名,通过操作符&来实现。// 左值定义格式数据类型 & 表达式// 实例int a=10;int & ia=a;ia=2;左值引用的特点:(1)一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束。(2)引用变量只是其他对象的别名,对它的操作和对原来变量的操作具有同样作用。(3)指针变量与引用有两点主要区别: (A)指针是一种数...原创 2021-06-27 17:54:23 · 3945 阅读 · 5 评论 -
C++ namespace 命名空间的定义和应用
目录1. 命名空间的作用:2. 应用场景:3. 命名空间的定义:4. 命名空间可以嵌套:5. 命名空间是开发的,可以随时把新的成员加入到命名空间中:6. 命名空间别名的定义:1. 命名空间的作用:用来处理不同代码段之间的名称冲突问题。2. 应用场景:(1)在一个应用程序的多个文件中可能会存在同名的全局对象,这样会导致应用程序的链接错误,使用命名空间可以消除命名冲突的问题。(2)在编写代码时,可能你编写了一个名为func()的函数。后面在使用第三方库的时候,原创 2021-06-26 19:09:25 · 1917 阅读 · 3 评论