自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(124)
  • 资源 (4)
  • 收藏
  • 关注

转载 C++11新特性点评

C++0x(C++11)新特性点评白杨http://baiy.cn C++11 在不久之前已获通过,它对 C++03 的扩充主要体现在核心语言和标准库两个方面。作为《C++编码规范与指导》中的一个小节,本文主要讨论 C++11 中,新特性所带来的变化。目录核心语言 右值引用和移动构造语义 常量表达式(constexpr) 放宽的 POD 类型定义 ex...

2019-08-15 11:05:55 273

转载 深入理解C++异常机制

https://www.cnblogs.com/hdk1993/p/4357541.html还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分。本文将在尽量少引入底层细节的前提下,讨论 C++ ...

2019-08-15 09:54:52 2262

转载 从源代码到程序在内存中运行的全过程解析

作为一个C/C++程序员,搞清楚从编写源代码到程序运行过程中发生的细节是很有必要的。这在之前也是困扰我的一个很大问题,因为最近在忙着找实习,一直没有下定决心来写这篇博客,最近才抽时间写。下面的代码除了明显贴出来的以外,其他的都以下面的代码为例进行说明:int gdata1 = 10;int gdata2 = 0;int gdata3;static int gdata4 = 11;s...

2019-08-15 08:55:50 1137

转载 深入理解C++中的mutable关键字

mutable突破const的限制,在被const修饰的函数里面也能被修改mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会...

2019-08-14 17:29:08 263

转载 explicit 类构造函数的隐式转换

限制类编译器调用构造函数的隐式转换(单一入参构造函数)我们知道C++是一个类型严格的语言,比如下面一个函数void test_int_proxy(const int_proxy& v) { printf("%d", v.value());}调用者对其传参也应该是一个int_proxy的对象,但是实际情况并非如此。那该如何表述,我个人觉得应该是:编译器对...

2019-08-14 17:06:20 203

转载 C++中的void类型

1.1. void类型void类型其实是一种用于语法性的类型,而不是数据类型,主要用于作为函数的参数或返回值,或者定义void指针,表示一种未知类型。1.1.1. 作为函数参数与返回值void func( void );void func( );例如上面两例,其实两种声明方式是等效的,在C++中如果参数列表为空,默认的参数类型即为void,但建议没有参数时使用void以提高程序...

2019-08-14 17:00:06 5782

转载 struct结构体以及字节对齐

structstruct可以将一些相关联的数据打包成一个整体。既然提到了struct那么肯定就避免不了结构体,结构体的内存对齐。1. 什么是结构体?结构体是一系列类型数据的集合这些数据可能描述了一个物体。2. 什么时候会用到结构体?1. 当内置类型无法满足用户需求的时候,没有合适类型的时候,需要封装特定的类型2. 当函数有多个参数时,或者函数的返回值过多的时候,需要封装特定的...

2019-08-14 14:05:36 926

转载 sizeof运算符

sizeof运算符sizeof是最冤枉的关键字,它是一个运算符而不是函数!!!1. sizeof是一个关键字(操作符),它的结果类型是size_t.它在头文件中typedef为unsigned int类型。sizeof是算符,而strlen是一个函数2. sizeof可以用类型做参数,strlen只能用char*做参数,而且必须是以’\0’结尾的,sizeof还可以用函数调用(不执行函数...

2019-08-14 14:01:15 180

转载 C关键字Register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。一、皇帝身边的小太监----寄存器不知道什么是寄存器?那见过太监没有?没有?其实我也没有。...

2019-08-14 13:40:49 346

转载 c/c++进程的虚拟内存布局

五大区:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一...

2019-08-13 17:20:56 2851

转载 深入理解C/C++ 关键字const

1 常量函数则包含一个this的常量指针这仅仅是编译器的限制,我们仍然可以绕过编译器的限制,去改变对象的状态,可以强制转换类型 Fred* pFred = (Fred*)this; pFred->intValue = 50;也可以构造另外一个指向同一块内存的指针去修改它的状态。2 常量对象调用非常量函数,编译时会产生语法错误3C++也允许在数据成员...

2019-08-12 18:37:41 793

转载 从编译器角度看本质:C/C++ 中 volatile 关键字详解

目的:建立语言级别的 memory barrier实现:声明的类型变量表示可以被某些编译器未知的因素更改,编译器对访问该变量的代码就不再进行优化,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存。实践:1) 中断服务程序中修改的供其它程序检测的变量需要加 volatile; 2) 多任务(多线程)环境下各任务间共享的标志应该加 vol...

2019-08-12 17:43:14 281

原创 从编译器角度看本质:C/C++中static的用法全局变量与局部变量

要区分声明周期和作用域。static 局部变量,会存在data段,是其在整个程序执行过程中都存在,并且只有一份。data段是一个全局的内存空间,且变量以保持一份。类的成员变量会在程序运行前初始化,在程序退出后析构。函数局部静态变量,在第一次使用时初始化,在程序退出后释放。使用字面常量初始化一个本地静态 POD 数据(局部静态变量),实际上,这类初始化并不是在程序第一次执行到该变...

2019-08-12 16:39:35 2488

原创 内存池与C++实现

https://blog.csdn.net/u010183728/article/details/815313921. 内存池设计1.1 目的在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中。1.2 要求尽量减少内存碎片,平均效率高于C语言的malloc和free。1.3 设计思路将buff...

2019-08-12 13:57:46 238

转载 从演变历史,看透本质:查找算法以及红黑树

https://blog.csdn.net/yang_yulei/article/details/26066409https://blog.csdn.net/yang_yulei/article/details/26104921https://blog.csdn.net/zhichaosong/article/details/88844371二分查找前提是有序,且静止不变。...

2019-08-08 14:55:18 214

转载 TCP、UDP数据包大小的限制

局域网环境下,建议将UDP数据控制在1472字节以下Internet编程时,建议将UDP数据控制在548字节以下.进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。...

2019-08-06 10:23:12 747

原创 不用c/c++的标准库,如何实现一个函数

不用库的话,就只能用语言本身来实现需要的函数,在需要时可以使用os提供的api和系统调用。就是模仿标准库的实现。char *strncpy(char *dest, const char *src, size_t count){ char *tmp = dest; while (count) { if ((*tmp = *src) != 0) src++; tmp++...

2019-08-06 09:04:15 449

原创 c++如何实现可变参数

除了用可变参数宏外,还可以用initializer_listint initializerSum(initializer_list<int> il) { int sum = 0; for (auto ptr = il.begin(); ptr != il.end(); ptr++) //类似于容器的操作 { sum += *ptr;...

2019-08-05 23:02:32 5559

原创 C语言如何实现多参数函数

也就是c语言如何实现变长参数。int printf(const char* format, ...);调用惯例,参数从右到左入栈,具名参数format(称之为lastarg),在进程虚拟内存空间栈的顶端,即小地址端(栈是从大地址到小地址增长的。)使用方式:va_list ap;//定义一个变量, 一个指针。用来指向各个不定参数。类型为 void* 或 char*va_start...

2019-08-05 22:28:23 7505

原创 如何判断一个list里是否有环

使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。https://blog.csdn.net/mucaoyx/article/details/81395782...

2019-08-05 22:00:22 1433

转载 从编译器角度看: lambda表达式

lambda转换为函数对象。现在,Android已经全面转向C++11/14标准了,看代码的话,很多地方变化很大,新标准真的是有点颠覆性的,感觉已经不会C++了。今天有看到lambda表达式,突然想看一下,这货是怎么实现的,如下,写了个例子,分别调用3个lambda表达式: 1 2 3 4 5 6 7 8 9 ...

2019-07-26 10:07:18 295

原创 数据类型与右值引用

数据类型:1)标准定义了一些规则,比如占用内存大小,以及对这段内存的解释规则;2)编译器实现这些规则: 分配多大的内存,并对他解释为人类语言。int i=8;i在分配4字节内存空间: 00000000 00000000 00000000 00001000, 并解释为8;如果将这段内存解释为char,则编译器只取一个字节,并解释为相应的字符。(当然有可能不存在这样的字符。)...

2019-07-25 13:52:45 225

转载 异常exception与error-code

异常与错误代码的本质区别之一——异常会自动往上层栈传播:一旦异常被抛出,执行流就立即中止,取而代之的是自动的stack-unwinding操作,直到找到一个适当的catch子句。 相较之下,使用error-code的话,要将下层调用发生的错误传播到上层去,就必须手动检查每个调用边界,任何错误,都必须手动转发(返回)给上层,稍有遗漏,就会带着错误的状态继续往下执行,从而在下游不知道...

2019-07-19 08:56:34 6422

转载 C++的类型转换

C++的类型转换——显示转换VS隐式转换、转换函数合理的转换可以使得程序更加简洁,不合理的转换往往导致程序错误和崩溃。C++类型的转换可以分为显式转换和隐式转换两种,显示转换是指通过类型转换函数对类型进行转换,隐式类型转换是指由编译器自动生成的转换。隐式转换的前提是存在合理的转换对象。l隐式类型转换发生的场合——build-in类型1.两种不同类...

2019-07-19 08:42:16 1153

转载 C++ auto and decltype Explained, by Thomas Becker

http://thbecker.net/articles/auto_and_decltype/section_01.html

2019-07-19 08:40:22 101

转载 C/C++中volatile关键字详解

1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that a...

2019-07-19 08:39:00 143

转载 浅谈unsigned int与int相加的问题

当unsigned int 和int相加时,计算过程中会强制提升(转化)为 unsigned int进行计算,表达式的类型也为unsigned int。int main() { int a = -30; unsigned int b = 15; int w = a+b; if(a+b > 0){ printf(...

2019-07-12 22:16:06 819

转载 memcpy的实现

1)注意对输入指针是否为NULL的判断;2)输入和输出的类型 void *3)强制将void* 指针转换为char* 再进行拷贝操作void * memcpy(void *dest,void *src,unsigned count ){ if (dest == NULL || src == NULL) { return NULL; ...

2019-07-12 22:11:06 392

转载 多线程编程:伪共享(false sharing)

在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理 6百万 订单!在讲到 Disruptor 为什么这么快时,接触到了一个概念——伪共享( false sharing ),其中提...

2019-04-30 14:10:29 633

转载 可以省略二维数组的行数,但不能省略列数:定义接受二维数组作为实参的形参时

(1)数组的寻址方式编译器在处理二维数组时,对于array[m][n]的数组,如果要取特定位置的值,比如array[i][j]处的值,编译器的寻址方式是 array + n * i+ j即每行有几个元素(列的数量)。(2)内存的分布二维数组在内存中的地址排列方式是按行排列的,第一行排列完之后再排列第二行,以此类推。因为,当给出数组的列数时,通过列数与行数的关系...

2019-04-28 11:07:12 9743 2

原创 对++a和a++的重载

首先知道他们的区别:i++ : 表达式的值是i,i值也会增加1;++i:表达式的值是i+1,i值也增加1在重载某个类的两个++时:(1)i++clone一个临时对象,保持i值; //注意,不要怕使用空间,该使用时也得使用,后面可以优化将成员data加1;返回新生成的临时变量;(2)++i:直接将成员data加1,然后返回 *this...

2019-04-11 07:16:54 745

原创 二叉树的遍历:层序遍历,前序遍历,中序遍历,后序遍历

层序遍历:可以采用队列的数据结构。当前节点入队->然后出队,出队时将其左右孩子入队,循环队列进行出队,每次出队将其左右孩子入队。当队列为空时,整棵树层序遍历完毕。...

2019-04-11 07:09:25 310

原创 删除数组中某个元素

1) 使用不是该元素的值生存一个新的数组; 时间复杂度o(n),空间复杂度O(n)2)从end开始遍历,当遇到该元素时,将后面的元素前移;时间复杂度o(n*n),空间复杂度O(0)std::vector<int> removeElementFrom(std::vector<int> vec, int elem){ std::vector<int&gt...

2019-04-11 07:05:25 428

原创 c++中const 对象与const 成员函数

为了确保const 对象的数据成员不会被改变,在C++中,const 对象只能调用const 成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改, 但是它没有被const 关键字限定的,也不能被常量对象调用。常量对象 只能 调常量函数,如果调用了非常量函数,编译时会出错。D:\cppTest\ms\const.cpp [Error] passing 'const Cons...

2019-04-10 21:40:31 629

转载 C++虚函数表,虚表指针,内存分布

虚函数表和内存分布那一块转载自:https://blog.twofei.com/496/虚函数效率转载自:https://www.cnblogs.com/rollenholt/articles/2023364.htmlhttps://blog.csdn.net/li1914309758/article/details/79916414前言大家都应该知道C++的精髓是虚函数吧?...

2019-04-08 14:58:38 747

转载 C++ 虚函数表解析

前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不...

2019-04-08 14:25:31 152

转载 RTTI: 观念,机制解析和实现原理

C++的 RTTI 观念和用途https://www.cnblogs.com/findumars/p/6358194.html自从1993年Bjarne Stroustrup 〔注1 〕提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI;最近新推出的C++ 或多或少已提供RTTI。 然而,若不小心使用RTTI,可能会导致软件弹性的...

2019-04-08 13:11:03 1023

转载 深入探讨dynamic_cast

dynamic_cast < type-id > ( expression)该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。dynamic_cast运算符可以在执...

2019-04-08 12:46:34 157

转载 new和delete 的用法以及在stl库allocte实现的应用

“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{...

2019-04-08 06:49:08 235

转载 new/delete 详解

转自:https://blog.csdn.net/hihozoo/article/details/51441521一、new/delete 简介new 和 delete 是 C++ 用于管理 堆内存 的两个运算符,对应于 C 语言中的 malloc 和 free,但是 malloc 和 free 是函数,new 和 delete 是运算符。除此之外,new 在申请内存的同时,还会调用对象的构...

2019-04-07 22:32:58 1097

stl的起源和发展

stl之父和你聊STL的起源和发展,深度了解STl的前身和今世,以及和C++的关系。

2018-11-01

TDD-LTE基本信令流程

TDD-LTE基本信令流程,比较全,比较经典。 在了解理论基础上,看看信令流程是学通信比较好的途径哦。

2011-07-19

Android开发教程笔记完全版

从零点起步,学习android的开发基础,特别是基本的UI开发。

2011-03-05

爱立信版3G网络结构

详细描述了3G网络的结构体系,包括介入网,核心网。此外,还描述了个接口的协议栈结构。

2009-04-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除