C++
文章平均质量分 73
__乔木
人是铁,学习是钢
展开
-
C++中防止多次包含头文件:#pragma once和 #ifndef的区别
目的:为了避免同一个文件被include多次同一个文件被include多次的危害:(1)防止重复定义的错误;(2)如果这个头文件变化,那么所有include这个文件的源文件都需要重新编译,即使没有去使用里面的任何内容避免措施:(1)头文件加#pragma once(2)头文件加#ifndef 宏名 #define 宏名 #endif两者区别:(1)#ifndef和#pragma oncr都发生在预处理阶段,#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多原创 2022-05-24 17:30:02 · 2990 阅读 · 0 评论 -
无锁队列的实现(陈皓)
在开始说无锁队列之前,我们需要知道一个很重要的技术就是CAS操作——Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是 CMPXCHG 汇编指令。有了这个原子操作,我们就可以用其来实现各种无锁(lock free)的数据结构。这个操作用C语言来描述就是下面这个样子:(代码来自Wikipedia的Compare And Swap词条)意思就是说,看一看内存*reg里的值是不是oldval,如果是的话,则对其赋值ne转载 2022-05-21 15:41:34 · 776 阅读 · 0 评论 -
C++:管理虚方法:override和final
前言虚方法实现的动态多态给我们的程序 带来了很多便利和操作的空间。但是其 也 带来的一些编程陷阱。override假设 一个 派生类 想覆盖重写 一个 基类的虚函数,如果程序员因为粗心导致其函数特征标不同的话,导致的的是 派生类 隐藏重名的基类虚函数,而不是覆盖。class A{public: virtual void show(char);};class B:public A{ virtual int show(std::string);};如上图所示,我们原创 2022-05-13 12:23:32 · 329 阅读 · 0 评论 -
C++:虚继承中对象模型分析
前言我们知道 在多继承中,特别是 菱形继承中,会有两个问题:内存的浪费。二义性。所以 引进了虚继承来 解决问题,虚继承和虚函数的原理很类似。 虚继承有 vbptr(虚基类指针) 指向 vbtable(虚基类表)。 那底层到底如何实现,我们 从 类的对象模型来分析。对象模型分析工具: vs 开发工具命令: cl /d1reportSingleClassLayout[className] XXX.cpp测试类我们来看 类Bb 和 Cc 是怎样的布局:Cc 同理,我们就不演示了。原创 2022-05-12 23:12:11 · 986 阅读 · 0 评论 -
static_cast 剖析
前言语法 :static_cast< 想要的类型> (原数据), 是C++中的关键字-------在C++中,我们经常用到 隐式的类型 转换,比如 char->int , int ->double, 类层次结构中基类 和 派生类之间指针或引用的转换。-------编译器隐式执行的任何类型转换都可以由 static_cast显式完成。-------需要注意的是, 我们要 确保 目标数据类型 是 我们想要的类型,因为static_cast 不做 运行时的类型检查。-----原创 2022-05-11 23:41:09 · 6823 阅读 · 0 评论 -
const_cast-详解一篇就够了
前言是C++中的关键字,用于类型转换,cons_cast 有两个功能:加上const,去掉const。 在开发中,我们往往用到 后者。 只能用于指针和引用!!。-去掉const:type * variable =const_cast< typename* > (expression)加上const:const type * variable =const_cast< typename > (expression去掉const用于4种场景,常量指针(const in原创 2022-05-09 17:26:54 · 4026 阅读 · 3 评论 -
C++面试常考点:字符串常量
引言C++ 字符串常量存储在 静态数据区(静态数据区还存储着 全局数据和静态数据)。所以可以将字符串常量又叫 无名的静态变量。因为字符串常量很少改动的特性,将其存储在静态数据去其实也很好的提高了访问效率。字符串常量以 const char* 的方式存储在 静态数据区。指针和数组当几个字指针赋值给 相同的字符串常量时,实际上会指向相同的的内存地址。但是用相同的字符串常量初始化 数组的话,内存地址又各不相同。void test(){ char* str1="123"; char*原创 2022-05-01 20:09:26 · 834 阅读 · 0 评论 -
gn4.9中__gnu_cxx::__pool_alloc详解和std::allocator的比较
#include<iostream>#include<ext\pool_allocator.h>using namespace std;template<class Alloc>void cookie_test(Alloc alloc,size_t n){ typename Alloc::value_type *p1,*p2,*p3; cout<<"n="<<n<<endl; cout<<"原创 2022-04-29 11:09:32 · 777 阅读 · 2 评论 -
C++11:thread详细总结
线程之间是相互运行的,不是说谁先创建,就先一直执行谁。要看CPU的调度机制。线程入口函数可以使用仿函数(函数对象,函数符)。我们创建线程的数量受CPU的影响,如果超出CPU核心数所能搭载线程数的最大值,则会有许多转换操作,导致CPU性能下降。C++11 thread提供了一个公有静态函数得到此电脑能搭载的线程的最大值。[详解]((135条消息) 多线程线程数设置多少合适_OrderDong的博客-CSDN博客_线程池线程数量设置多少最好)cout << thread::har..原创 2022-04-22 11:30:12 · 8718 阅读 · 0 评论 -
错误分析:非静态成员引用必须与特定对象相对
引言我们首先要知道一点,类的静态成员只能访问 静态成员变量。发生这个错误一般有两种情况。第一种:静态成员访问方式出错在函数中对于静态成员,我们有下面的访问方式ClassName::MemberName但是如果我们直接用这种方式访问非静态成员的时候,就会报标题错误。第二种:在静态函数内调用非静态函数因为类的普通成员函数不能作为回调函数,所以我们经常将类中的回调函数设置为 静态成员函数。但是在静态成员函数中调用非静态成员函数也会报标题错误,对于这种场景,我们有两种解决方法:将调用的非静原创 2022-03-07 12:11:15 · 10967 阅读 · 1 评论 -
C++:带你搞定数组的疑难杂症--缓冲区溢出;数组越界;为什们打印内容能超出数组长度?
文章目录前言Ⅰ- 输入超出内容存入数组没有前言先给大家看看一段测试: char s[10]; cin>>s; cout<<"strlen(s):"<<strlen(s)<<endl; cout<<"sizeof(s):"<<sizeof(s)<<endl; cout<<s[12]<<endl; cout<<s;输入:0123456789.原创 2021-06-01 20:26:39 · 4672 阅读 · 3 评论 -
C++:一篇文章,带你玩转 函数模板以及重载解析,函数还可以这样玩?
⚪⚪函数重载不是很了解的同学可以看看:点这里文章目录前言Ⅰ- 初识Ⅱ - decltype关键字瞅瞅decltype的两把刷子前言场景:编写一个函数,返回两个数相加的值。假设是两个 int类型的数,我们需要声明原型:int add(int a,int b);假设是两个 double类型的数,我们需要声明原型:double add(double a,double b);分析:虽然用到了函数重载,但是用的是同样的技术,这样的代码就很冗杂,。不仅浪费我们的时间,并且容易出错。所以大佬们就为C+.原创 2021-05-30 22:30:17 · 350 阅读 · 8 评论 -
C++:函数重载(你不知道的细节)
----------------------别让现实太饿,吃了梦想文章目录前言Ⅰ- 初识Ⅱ- 函数特征标Ⅲ - 调用和原型匹配前言在不同的场景下,我们经常希望使用同一个函数名完成相同的任务,但是使用不同的参数列表。(例如:一个add函数完成两个int变量的相加,另一个add函数完成两个double变量的相加)Ⅰ- 初识我们通过一个实例来完成前言提到的例子:int add(int a,int b){ return a+b;}double add(double a,double b){原创 2021-05-24 19:05:29 · 502 阅读 · 10 评论 -
C++:实例出发,解决引用在不同场景的用法
引用详解原创 2021-05-18 10:32:49 · 1382 阅读 · 14 评论 -
c++:内联函数详解和普通函数的区别
前言内联函数是c++为了提高程序的运行速度做的改进,它与普通函数区别在于: 编译器如何将它们组合到程序中。所以我们需要深入到程序内部。我们的最终的可执行程序由 一组机器指令组成。程序运行时,计算机逐步执行指令。常规函数常规函数调用时会使程序跳到另一个地址(函数的地址),并且在函数结束时返回。执行函数调用指令,立即存储该指令的地址,并将函数参数保存到的堆栈。...原创 2021-05-14 19:32:03 · 1820 阅读 · 12 评论 -
C++:指针小白易混点
文章目录指针和常量指针和常量程序清单1.1:int a=6;const int *p=&a;这个可以修改指针p的指向吗?意思就是此时的p是指向一个常量对象?还是指针本身是一个常量对象?在这里,指针p指向一个 const int(6)。所以对于指针p而言是指向一个常量对象,意思就是不能通过 p 来改变变量a的值。注:这里有个要注意的事情, 并没有改变 变量a的属性,就是我们可以直接通过a来改变其自身的值。我们可以将const的变量的地址赋给常规指针吗?显而易见,C++是禁止原创 2021-05-08 20:23:58 · 133 阅读 · 0 评论 -
C++:指针和new,delete详解
文章目录前言new-分配内存delete-释放内存使用new创建动态数组声明获得内存 vs new获得内存前言计算机程序在存储数据时必须要跟踪的三种基本属性:1.信息存储在何处。2.存储的值为多少。3.存储的信息类型。对于在声明指针时,顺便说说 *运算符(间接值或解除引用运算符)两边的空格是可选的。传统上,c语言程序猿喜欢这样干:int *p;(这里强调的是 *p 是一个int类型的值)而很多c++的埼玉喜欢这种格式:int* p;(这里强调的是:int* 是一种类型–指向int原创 2021-05-07 21:12:17 · 6110 阅读 · 4 评论 -
C++输入时对换行的处理
眼前一亮先看一个混合输入数字和字符串的例子: int a; char s[10]{}; cin>>a; cout<<"a:"<<a; cin.get(s,10); cout<<s;输出结果??。。。。。理想:现实:分析:相信读者已经发现了,用户根本没有给字符输入的机会。问题在于我们给a输入时,通过回车键生成的换行符保留在了输入队列中,后面的get()只能吃到前面的尾气,而面向行数输入的get()以换行符结尾 在看到第一原创 2021-05-02 16:43:36 · 24182 阅读 · 3 评论 -
C++:指针和数组(为你解惑)
一.数组名就是指针?相信听过这样的话:数组名就是指针。这不管是我们的授课老师,还是有些程序设计的书籍中都有这样说过。但是,这样并不严谨。他是指针,他又不完全是。现在来看一看数组表达式:ary[1]。显而易见,这是指数组中的第二个元素。但是在编译器看来,这个表达式看作是 *(ary+1) 。这意味着实现的方法是先找到地址,再取其中的值。这里和指针异曲同工。看代码:程序清单 1.1 char str[]="123456"; char *c=str; cout<<"*str:"&l原创 2021-04-26 21:00:57 · 858 阅读 · 2 评论