c/c++基础
hiyajo_salieri
fight for light
展开
-
从汇编层面深度剖析c++虚函数
来源: 海枫,2011-04-20链接:http://blog.csdn.net/linyt/article/details/6336762虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合格的试金石。csdn网友所发的一篇博文《VC虚函数布局引发的问题》从汇编角度分析了对象虚函数表的构,以及C++指针或者引用是如何利用这个表来实现运行时多态。转载 2017-02-23 11:24:06 · 328 阅读 · 0 评论 -
编译器自动优化——为什么我的C++编译器不调用拷贝构造函数了?
今天在学习《深入理解C++11》中关于移动构造函数的内容时,发现了这么一个问题:#include #include #include #include #include #include using namespace std;class HasPtrMem{public: HasPtrMem() :d(new int{0}) { cout << "Constrcut"原创 2017-03-06 17:24:12 · 1014 阅读 · 0 评论 -
利用STL中的partition完成快排
学习《STL源码剖析》p354时,发现STL中已有partition函数,这不禁让人联想到c语言实现的快排:int Partition(int k[], int low, int high){ int point; point = k[low]; while( low < high ) { while( low = point ) { high--; } swa原创 2017-04-03 18:30:46 · 2019 阅读 · 0 评论 -
C++任意进制转任意进制的转换函数实现
作为一个半路出家的C/C++开发者,平日里最讨厌使用C++处理字符串以及处理类型转换的问题,不甚其烦。今天在做CVTE的笔试题的时候又遇到了进制转换 因此在这里对进制转换做一个总结吧。C++内置的itoa是非常强大的,能够将十进制的int型转换成任意进制的字符串输出,利用这一点,实际上任意进制的互相转换利用itoa以及设计一个函数来实现任意进制-》十进制的组合即可。。PS:原创 2017-03-22 21:38:26 · 9703 阅读 · 0 评论 -
使用vector::reserve来避免不必要的重新分配
关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。) 对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。这个类似于realloc的操作有四个部分:分配新的内存块,它有容器目前容量的倍数。在大部分实现中,vector和str转载 2017-03-22 22:56:39 · 318 阅读 · 0 评论 -
C++中的异常安全、以及copy_and_swap
参考effective c++条款29可知,C++中的异常安全提供以下三个保证之一:基本承诺: 如果异常被抛出,应该保证函数中的状态还是可控的,也就是说当前函数内没有任何对象或者数据结构被破坏,仍然是合法的状态。强烈保证: 如果异常被抛出,函数的内部各个状态应该和发生异常之前的状态相同(类似于回滚了状态);不抛掷异常保证: 该函数不发生异常。其中强烈保证往往原创 2017-04-08 21:46:28 · 452 阅读 · 0 评论 -
腾讯2017暑期实习生OMG事业群一面面经
总结 主要问简历 1.复制构造函数什么时候需要重写2.多进程同步方式,多线程同步方式3.两道编程题(数学问题)大数据下点集里最短距离的两点,优化时间(邮局问题,当时忘了…)4.c++11里并发处理的优势5.以腾讯视频为例讲后台的开发大概架构6.stl的局限性7.分布式服务器负载均衡策略8.会不会linux开发 会不会数据库(不会)原创 2017-04-17 19:35:25 · 2621 阅读 · 0 评论 -
不使用temp变量来交换两个值??该使用异或吗?
通常碰上这种问题,大多是在c++面试中,通常的答案有使用异或来实现,比如如下代码:反转字符串"abcde"为"edcba"{ char *begin = str; char *end = str+n-1; while(begin<end){ *begin^=*end; *end^=*begin; *begin^=*end;原创 2017-05-02 16:15:44 · 704 阅读 · 0 评论 -
迭代器失效问题——小心使用erase()
删除指定元素:for (auto it = vec.begin(); it != vec.end(); ) { if (*it ==3) { it = vec.erase(it); } else { it++; } } for (int i=0; i { if (vec[i] == 3) { std转载 2017-05-11 21:31:40 · 846 阅读 · 0 评论 -
C++11完成单生产者单消费者模式
#include #include #include #include #include #include static const int kItemRepositorySize = 10; // Item buffer size.static const int kItemsToProduce = 1000; // How many items we plan to原创 2017-07-03 16:44:27 · 522 阅读 · 0 评论 -
容器的capacity、max_size以及内存分配
capacity - 容器的成员函数capacity()取得max_size - 容器的成员函数max_size()取得STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样转载 2017-02-27 18:00:27 · 324 阅读 · 0 评论 -
C++中的虚拟继承
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual A;class B2:public vi转载 2017-02-27 16:00:17 · 159 阅读 · 0 评论 -
fopen与open的区别
如题,看到好多调用设备文件的程序都是用的open函数,难道用fopen不可以吗?主要求高手谈谈这两个函数的区别,以及具体在什么时候该用哪个函数? 第 1 楼 tent8()2006-8-26 17:53:47得分:2 fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核apilinux中的系统函数是o转载 2017-03-09 11:22:38 · 317 阅读 · 0 评论 -
曾经所遇到的C/C++与python的技术坑一二
一.python中去除列表list中重复元素的方法:1.使用内置的set,将list作为set的构造函数构造一个set再转换为list即可(但是会改变元素的排序,同fromkey)example:(1) l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2(2) l1 = ['b','c','d原创 2017-02-23 14:49:38 · 551 阅读 · 0 评论 -
const指针与指向const的指针的辨析
经常看到诸如const int * a以及int const *a 或者int *const a这样的指针,最初不理解时总是一头雾水,实际上区分起来非常容易,我们可以以*与const的相对位置为参考,如果const在*左边,那我们可以知道这是指向const的指针,反之则是const指针。指向const的指针,它指向的内容是不可变的,也就是说解引用*a的值不可以改变con原创 2017-02-23 15:53:57 · 214 阅读 · 0 评论 -
LFU与LRU的不同
LRU和LFU是不同的!LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!比如,第二种方法的时期T为10分钟,如果每分钟进行一次调页,主存块为3,若所需页面走向为2 1 2 1 2 3 4转载 2017-03-03 11:30:09 · 251 阅读 · 0 评论 -
句柄是什么以及句柄和指针的区别
句柄在Windows编程中是一个很重要的概念,再许多地方都扮演着重要的角色。在Windows环境中,句柄是用来标识项目的,这些项目包括:模块、任务、实例、文件、内存块、菜单、控制、字体、资源、GDI对象等它是Windowss操作系统为各应用程序腾出的一些内存储地址,用来专门登记各应用对象再内存中的地址变化。这个地址是在对象装载(load)时由系统分配的,在卸载时又释放回系统。它并不原创 2017-02-24 16:43:19 · 345 阅读 · 0 评论 -
与全局对象相比,使用静态数据成员的优势
同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能; 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都原创 2017-02-25 09:09:40 · 1498 阅读 · 0 评论 -
不要使用vector<bool>
做为一个STL容器,vector>有两个问题.第一,它不是一个真正STL容器,第二,它并不保存bool类型.除此以外,并没有太多东西与本节题目有关(译注,还不够多吗)一个东西不能成为一个STL容器,只因为会有人说它是一个(译注,:( ).一个东西要成为STL容器,必须满足所有列于C++标准23.1节的容器要求.在这些要求中,有这样一条:如果C是一个T类型元素容器,并且C支持operat转载 2017-02-25 09:11:01 · 474 阅读 · 0 评论 -
静态数据成员受private控制符的作用
今日在看《c/c++程序员面试秘笈》时,有如下题,p173面试题:对静态数据成员的正确描述是:A.静态数据成员可以在类体内进行初始化B.静态数据成员不可以被类对象调用C.静态数据成员不受private控制符作用D.静态数据成员可以直接用类名调用这里答案给的是CD,对于C有所疑问,于是写下如下代码进行测试:#include #include原创 2017-02-25 09:57:01 · 2569 阅读 · 4 评论 -
C++的四种类型转化符
C++有四种强制类型转换符,分别是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast与运行时类型转换密切相关,在这里我们先介绍dynamic_cast,其他三种在后面介绍。1、dynamic_cast运算符该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用。转载 2017-02-24 21:08:57 · 283 阅读 · 0 评论 -
每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到转载 2017-03-05 16:42:46 · 190 阅读 · 0 评论 -
C++ STL容器底层实现
STL底层数据结构实现C++ STL 的实现:1.vector 底层数据结构为数组 ,支持快速随机访问2.list 底层数据结构为双向链表,支持快速增删3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问deque是一个双端队列(dou...转载 2019-07-10 16:55:38 · 271 阅读 · 0 评论