- 博客(42)
- 收藏
- 关注
原创 void_t
void_t源码分析和常规范例功能:能够检测到应用SFINZE(替换失败并不是一个错误)特性出现的非类类型,换句话来说,给进来的类型必须是一个有效类型判断类中是否有类型别名namespace nmsp1{ struct NoInnerType { int m_i; }; struct HaveInnerType { using type = int; //类型别名 void myfunc(){}
2021-12-07 22:28:38
693
原创 true_type与false_type
std::true_type和std::false_type实际上是类型别名是两个类型(类模板)注意区分true_type与false_type与true和false区别true_type,false_type代表类型true,false代表值nmsp1::FalseType myfunc1();//返回假这种含义nmsp1::TrueType myfunc2();//返回真这种含义自己模拟实现namespace nmsp1 { template<boo
2021-12-07 22:21:15
859
原创 declval
标准库的典型内容介绍C++标准库典型且常用的函数模板、类模板、别名模板等功能组件以及它们的实现细节std::declval基本概念和常规实例std::decval–C++新标准中出现的函数模板,没有函数体(只有声明、没有实现),无法调用,一般用于与decltype,sizeof等关键字配合来进行类型推导、占用内存空间计算等查看源码add_rvalue_reference:是C++标准库中的类模板,他的能力是给进一个类型,它能够返回该类型的右值引用类型。给进一个int类型,
2021-12-07 22:20:47
1655
原创 类模板可变参的逐步展开
类模板可变参的逐步展开myclasst<Args…>继承namespace nmsp1 { template<typename... Args> class myclasst { public: myclasst() { cout << "myclasst::myclasst()执行了,可变参数个数= " <<sizeof...(Args)<< endl;
2021-12-06 14:41:22
568
2
原创 如何查看类型推断3
auto类型推断auto类型常规推断:用于变量的自动类型推断。声明变量的时候初始化的类型自动为此选择匹配的类型,不需要程序员显示的指定类型auto的特点:auto的自动类型推断发生在编译期间auto定义变量必须立即初始化,这样编译器才能推断出它的实际类型,编译器才能确定auto类型以及整个变量的类型然后再编译期间才可以用真正的类型替换掉auto这个类型占位符auto的使用比较灵活,可以和指针、引用、const等限定符结合使用auto推断出来会代表一个具体的类型,au
2021-12-03 12:22:51
332
2
原创 如何查看类型推断2
万能引用类型从上一章如何查看类型推断中,我们发现经过模板的类型推导,T的类型是不完整的,我们想得到完全的类型template<typename T>void myfunc(T&& tmprv) { cout << "-----------------begin------------------" << endl; using boost::typeindex::type_id_with_cvr; cout <<
2021-12-03 12:22:18
472
原创 深入了解计算机系统课后习题
关于有符号数与无符号数的建议有符号数到无符号数的隐式类型转换导致了某些非直观的行为。float sum_elements(float a[], unsigned length) { int i; float result=0; for(i=0;i<=length-1;i++) result += a[i]; return result; }当参数length等于0时,运行这段代码应该返回0.0,但实际上,运行时会遇到一个内存错误。为什么会发生这样的错误?从.
2021-05-26 22:22:22
1198
原创 深入了解计算机系统数据编码深入理解
无符号数的编码用函数B2Uw(Binary to Unsigned)表示。原理:无符号数编码的定义对向量→X=[Xw−1,XW−2,...,X0]:\underset{X}{\rightarrow}=[X_{w-1},X_{W-2},...,X_{0}]:X→=[Xw−1,XW−2,...,X0]:B2Uw(→x)=∑i=0w−1xi2iB2U_w(\underset{x}{\rightarrow}) = \sum_{i=0}^{w-1}x_i2^{i}B2Uw(x→)=i=0∑.
2021-05-26 22:22:07
1269
1
原创 移位运算
计算机中有大端小端两种存储模式,进行循环移位就可对它们之间高字节和低字节进行转换。在进行超过8位的加法,运算器包含一个进位,记录之前低位运算有没有进位,然后在更高字节运算得出正确的结果。...
2021-05-22 11:35:56
201
原创 定点数表示
定点数:小数点位置固定浮点数:小数点位置不固定。无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值技巧:由[x]补 快速求 [-x]补 的方法符号位、数值位全部取反,末位+1...
2021-05-21 19:37:20
154
原创 字符与字符串
48 ~ 50 前4位都是0011 后4位对应BCD码中的8421码 例如 1 对应 0011 0001区位码 :94 * 94 的矩阵 把文字存进对应的区的某一个位在ASCII码中0~31中为控制、通信字符,当区位码两处都处于0 ~ 31之间就可能会造成信息交换时发生冲突,防止这种冲突,故区位码都加上32形成国标码。同时为了不与ASCII中的造成冲突,故加上16进制的 80H ,对应的就是1000 0000 这样8位中如果是汉字,最高位为1,就与127种ASCII码兼容了。一般汉字是两..
2021-05-20 22:43:26
197
原创 BCD码
BCD码:用二进制编码的十进制4位二进制能表示24-1个状态(即0~15)但BCD码只用其中的0 ~ 9,产生6种沉余。8421码: 位数 0 0 0 0 权重 8 4 2 1用8421码如何进行加法 例如上面的5 + 8 = 13 产生 1101 无法映射在8421码内,只需要加上6(0110)得到的结果 1 0011 然后再其前补3个0 ,即得到 0001 0011对应13的BCD码再例如: 9 + 9 = 18 1001 + 1001 =
2021-05-20 21:47:21
514
原创 原码的乘法
十进制 0.985 0.985 * 0.211 * 0.211 --------- ---------- 985 0.000985 985 0.00985 1970 0.1970 ---------- ---------- 0.207835 0.207835l为什么要
2021-05-20 12:42:40
620
原创 整数乘法运算
在高级语言中,两个n位整数相乘得到的结果通常也是一个n位整数,即结果只取2n位乘积中的低n位。这导致乘法运算得到结果必须在范围: -2n-1<= x*y < 2n-1才不会溢出。假设为4位,进行52 0101 * 0101 -------- 0101 + 0101 -------- 只取4位,即1001 为1111的补码 即为-7 00011001 ----在二进制乘法运算下,只有1*1等于1;再列如:32 0011
2021-05-19 19:33:59
5715
原创 计算机系统定点数编码表示
原码·表示数值例子采用4位二进制,最高位表示符号位,0代表正、1代表负缺点:1、0的表示不唯一,故不利于程序员编程+0:0000-0:10002、加、减运算方式不唯一3+2:3-2: 0011 0011 + 0010 - 0010 ---- ---- 0101 00013、需要额外对符号进行处理,故不利于硬件设计需要硬件对加法处理的同时又需要硬件对减法的处理,这大大增加了设计的难度。4、当a<b时,实现a-b比较困难2-.
2021-05-15 16:18:22
908
1
原创 2021-05-09
struct类类数据成员类体定义类的成员,我们的类只有数据成员(data member)。类的数据成员定义了类的对象的具体内容,每个对象有自己的一份数据成员拷贝。修改一个对象的数据成员,不会影响其他Sales_data对象。C++11新标准规定,可以为数据成员提供一个类内初始值(in-class initializer)。创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化编写自己的头文件为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字
2021-05-15 13:52:23
98
原创 2021-05-02
过程过程是软件一种很重要的抽象,它提供了一种封装代码的方式,用一组指定的参数和一个返回值实现某种功能,然后,可以在不同的地方调用这个函数。假设过程P调用过程Q,Q执行后返回到P。这些动作包含以下一个或多个机制。1、传递控制。在进入过程Q的时候,程序计算器必须设置为Q的代码的起始地址,然后再返回的时候,就需要把程序计算器设置为P中调用Q后面那条指令的地址。2、传递数据。P必须能够向Q提供一个或多个参数,Q必须能够向P返回一个值。3、分配和释放内存,在开始时,Q可能需要为局部变量分配空间,而在返回.
2021-05-09 16:25:32
264
原创 友元
友元是为了兼顾C语言程序设计的习惯与C++信息隐藏的特点,而特意增加的功能。友元机制是对一些类外的函数打开一个特殊通道,授权他们能够访问本类的私有成员变量。友元破坏了类的封装性和隐藏性,但有助于数据共享,能够提高程序的运行效率。友元的机制包括友元函数和友元类。友元函数在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为本类的友元函数。在类定义中声明友元函数形式:friend 函数类型 函数名(参数列表);//针对全局函数friend 函数
2021-05-08 20:43:50
264
原创 构造函数
构造函数在类体里的声明形式:类名(形参一,形参二,…);//也可以没有形参构造函数的定义形式:假设数据成员为x1,x2,…x,类外定义构造函数时通常有3种形式:1、类名::类名(形参1,形参2,…):x1(形参1),x2(形参2),…{ }2、类名::类名(形参1.形参2,…){ x1=形参1; x2=形参2;…}3、类名::类名()//成员变量所赋的初值都是固定的{x1=初始化表达式;x2=初始化表达式;…}说明:1、构造函数的名字必须和类名相同;2、在定义构造函
2021-05-08 15:02:26
4956
原创 c++内联函数
调用函数,需要进入其内部,如果函数是一个实现非常简单的功能的函数,那么花费在函数调用,进入内部一系列处理以及返回结果的时间比起实现的功能来说,时间开销非常大。这时可以采用宏的方式不过宏不进行类型检查,且有BUG。++x后,x为5,我们想要返回的结果应该是5才对,可是它返回6。这是因为宏是在编译阶段把宏定义的跟使用宏的地方进行替换。相当于以下方式。其实++n是实现两次,所以返回6.c++提供一种内联函数,在函数前加inline。它只是一种建议,编译器自己决定听不听取建议。这种内联函数是在编译阶段,把.
2021-04-26 12:08:34
69
原创 c++的默认参数
在编写程序时,当代码的参数太多,而且后面的参数不需使用时,可以这样做利用并且设计宏定义来做函数的参数,而宏带给我们有缺点,即它不会进行类型检查。c++提供一种给参数提供默认参数,即在不写其参数时,参数就会取事先写好的默认参数。但在进行书写默认参数时,注意:第一个默认参数后的所有函数都应该为默认参数。默认参可以写在声明或定义处,但不能出现同时出现在定义和声明中。一般写在声明处,声明处是可以暴露给外人观看使用的。...
2021-04-26 11:09:16
325
原创 2021-04-24
编写例如圆的编程时,3.14是个幻数,在阅读上其意义很难明确。在引用宏定义时,虽然其阅读性是提高了,宏定义在编译之前,会由编译器寻找与其对应字符进行替换。但是有一个缺点,那就是无法确定其类型,而且编译器不进行检查。这时可以在变量的类型前加上一个const,使之变成常量。常量的值是不可改变的。const修饰的常量可以用const的指针指向常量,变量指针是不能指向常量。但可以用强转来给一个非const的指针指向const常量。在编写时运用间接改变其const修饰的值,编译器是不会报错的。运行时就
2021-04-24 15:32:56
82
原创 c++40个基本特性-bool
bool在C语言中是没有布尔类型的,在C语言中0代表假,非0代表真。(.c文件下)在C++中有增加布尔类型,false代表假,true代表真。(.cpp文件下),并且它所占用的大小为一个字节。
2021-04-24 13:56:49
120
转载 LC-198
打家劫舍方法一:动态规划(出自leetcode)首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k~(k>2)k (k>2) 间房屋,有两个选项:偷窃第 kk间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的.
2021-04-24 13:40:28
147
原创 跳楼阶问题
牛客网-青蛙跳台这是一道经典的递推题目,你可以想如果青蛙当前在第n级台阶上,那它上一步是在哪里呢?显然,由于它可以跳1级台阶或者2级台阶,所以它上一步必定在第n-1,或者第n-2级台阶,也就是说它跳上n级台阶的跳法数是跳上n-1和跳上n-2级台阶的跳法数之和。设跳上 级台阶有F(N) 种跳法,则它跳上n级的台阶有F(N)=F(N-1)+F(N-2) 种跳法。然后,我们又思考初始(N-2<=0)的情况,跳上1级台阶只有1种跳法,跳上2级台阶有2种跳法,最终我们得到如下的递推式:这个递.
2021-04-24 13:40:04
118
原创 小偷劫舍二
LC-213打家劫舍方法一:动态规划首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。注意到当房屋数量不超过两间时,最多只能偷窃一间房屋,因此不需要考虑首尾相连的问题。如果房屋数量大于两间,就必须考虑首尾相连的问题,第一间房屋和最后一间房屋不能同时偷窃。如何才能保证第一间房屋和最后一间房屋不同时偷窃呢?如果偷窃了第一间房屋,则不能偷窃最后一
2021-04-24 13:39:17
112
原创 程序地机器级表示
使用现代地优化编译器最大的优点是:用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的为什么要花时间学习机器代码?通过阅读这些汇编代码。我们能够理解编译器的优化能力,并分析代码中隐含的低效率。尝试源代码的各种形式,每次编译并检查产生的汇编代码,从而了解程序将要运行的效率如何?有些时候,高级语言提供的抽象层隐藏了我们想了解的程序运行行为列如:用线程包写并发程序时,了解不同的线程是如何共享程序数据或保持数据私有的,以及准确知道如何在哪里访问共享数据。再列如:程
2021-04-23 00:22:59
739
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人