C/C++
文章平均质量分 58
TT_love9527
聪与敏,可恃而不可恃也,自恃其聪与敏而不学者,自败者也;
昏也庸,可限而不可限也,不自限其昏与庸而力学不倦者,自力者也。
展开
-
从.c或.cpp文件到可执行文经历的步骤
1. 预处理:(C:.i文件 C++:.ii文件) i. 宏定义指令,如#define、#undef等,前者用作替换,后者用作取消对某个宏的定义,使以后该串的出现不再被替换。 ii.条件编译指令,如#ifdef、#ifndef、#else、#elif、#endif等; iii.头文件包含指令,如#include<iostream>,#inclu...原创 2018-06-29 16:23:47 · 805 阅读 · 0 评论 -
自定义myVector窗口的实现(参考vector)
讲到STL库,避免不了容器,此处自定义实现一个vector,命令为myVector。当然,myVector不可与vector相比,大体的功能是实现了,最主要是没有涉及迭代器。实现的成员函数有:1、默认构造函数2、自定义构造函数3、拷贝构造函数4、赋值构造函数5、析构函数6、下标运算符7、size()8、capacity()9、clear()10、push...原创 2018-10-18 16:18:26 · 673 阅读 · 0 评论 -
宏定义和内联函数、及内联函数和普通函数的区别
一、宏定义和内联函数的区别1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。 内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。 2. ...转载 2018-09-18 22:47:37 · 718 阅读 · 0 评论 -
C++常见问题: 字符串分割函数 split
C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速分割这个问题了。列几个常用方法以备不时之需。方法一: 利用STL自己实现split 函数(常用,简单,直观)原型: vector<string> split(const string &s, const string &seperator);输入一个字符串,一...转载 2018-09-08 15:39:54 · 788 阅读 · 0 评论 -
volatile限定符——C++讲解
1、使用volatile的背景直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制。举例如下 :i、程序可能包含一个由系统时钟定时更新的变量。当对象的值可能在程序的控制或检测之外被心迹时,应该将该对象声明为volatile。告诉编译器不应对这样的变量进行优化。ii、变量读取volatile int i = 10;int k = i;这段代码如果没有加上...原创 2018-08-30 16:13:16 · 430 阅读 · 0 评论 -
从内存布局看C++虚继承的实现原理
参考博文:http://blog.csdn.net/xiejingfa/article/details/48028491准备工作1、VS2012使用命令行选项查看对象的内存布局微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout。使用方法很简单,直接在[工具(T)]选项下找到“Visual Studio命令提...转载 2018-09-04 13:33:04 · 239 阅读 · 0 评论 -
模版实参推断和引用
模版参数推断包含函数指针及引用等部分,此处只介绍有关引用的模版参数推断。考虑下面的例子:template<typename T> void f(T &p);其中函数参数p是一个模版类型参数T的引用,记住以下两点:i、编译器会应用正常的引用绑定规则;ii、const是底层的,不是顶层的。1、从左值引用函数参数推断类型当一个函数参数是模版类型参数的一个...原创 2018-08-21 12:33:30 · 193 阅读 · 0 评论 -
宏定义的使用,如#define后接#和##、宏展开等
之前相应了解#define和inline的区别,以及各自的优缺点(下篇文章再好好总结一下吧)。但被effective C++的作者的一句话,尽量少用宏(万恶之源)所惑,多少有些忽视了#define的特性。下面所转载的东西,第7条看的多少有些迷糊外,其他6点还总结的非常好。参考如下:众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的...转载 2018-08-16 18:18:35 · 1905 阅读 · 0 评论 -
setjump和longjmp函数
1、setjmp和longjmp函数特点此两函数所处头文件<setjmp.h>,弥补了C语言有限的转移能力,其必须协同工作,工作特点如下:i、记录:setjmp(jmp_buf j)必须首先调用,表示“使用变量j记录现在的位置。函数返回零。”ii、转移:longjmp(jmp_buf j,int i)可以接着调用。表示“回到j所记录的位置,让它看上去像是原先的setjmp(...原创 2018-08-08 23:47:24 · 404 阅读 · 0 评论 -
STL库查找算法——如上下界查找,最大最小值查找,统计次数,二分查找,子区间匹配查找,集合(集合内任意一个元素匹配)查找
STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中。众多算法中,查找算法是应用最为普遍的一类。以下算法参数均可以迭代器或指针。单个元素查找1、 find() 比较条件为元素是否相等的查找: 1 2 template <class InputIterato...转载 2018-08-12 10:43:17 · 827 阅读 · 0 评论 -
static关键字的作用说明
就目前,本人掌握的信息来看,static关键字的作用有俩,其一是在分离式编译环境下避免不同源文件中定义的全局变量使用相同的名字引发的命名冲突(有点绕脑),其二,有关类的静态成员定义说明。i、对第一点进行说明,static修饰符能够减少类命名冲突。如static int a; 注意此处把a看作是全局变量。(使用static修饰的局部变量不会随函数结束而释放地址空间!)通过static关健...原创 2018-08-09 16:10:54 · 409 阅读 · 0 评论 -
C语言中可变参数的实现即va_list、va_start、va_arg、va_end的说明
说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printf函数原型如下: asmlinkage int printk(const char *fmt, ...) asmlinkage表示通过堆栈传递参数。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,...转载 2018-07-27 16:05:20 · 1268 阅读 · 0 评论 -
malloc/free与new/delete的区别
1、C系统的函数库中提供的动态分配和释放内存空间的函数i、malloc函数:在内存动态存储区分配一段长度为size个字节的连续空间,如果分配成功,函数返回该函数的起始地址;如不分配成功,则返回空指针(NULL)。函数原型:void* malloc(unsignedint size) (函数返回的地址没有表明存储空间存储的数据类型,如果将该地址赋予一个具体类型的指针变量,则必须进行强制...转载 2018-07-01 20:45:53 · 129 阅读 · 0 评论 -
C/C++类的大小计算
1、关于类/对象大小的计算i、 首先,类大小的计算遵循结构体的对齐原则ii、 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响iii、 虚函数对类的大小有影响,是因为虚函数表指针VPTR带来的影响iv、 虚继承对类的大小有影响,是因为虚基表指针带来的影响空类的大小是一个特殊情况,空类的大小为12、需要注意的是类...转载 2018-06-26 13:40:00 · 1884 阅读 · 0 评论 -
定义行为像指针的类(类比于智能指针)和定义行为像值的类
一直纠结于智能指针shared_ptr的引用计数如何实现。此前看C++ primer不太注意,今天再次翻到这一知识点,再细看一遍,受益非浅呀。原来引用计数的实现也不过如此。1、定义行为像指针的类这里为避免同名,且只强调引用计数的实现,自定义了一个HasPtr类,其中最大特点是引入引用计数器。类指针的类,最大特点是底层数据共享。只对指针进行了浅拷贝。引用计数的工作方式如下四大特点:...原创 2018-10-16 11:41:48 · 463 阅读 · 0 评论