C/C++
文章平均质量分 55
StephenZou14
这个作者很懒,什么都没留下…
展开
-
class的sizeof
class的sizeof#include<iostream.h> class a {}; class b{}; class c:public a{ virtual void fun()=0; }; class d:public b,public c{}; int main(){ cout<<"sizeof(a)"<<sizeof(a)<<end转载 2016-09-12 21:07:07 · 370 阅读 · 0 评论 -
多继承与虚继承
多继承一般情况下,派生类都只有一个基类,称为单继承。除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类。多继承的定义多继承的语法如下,假设已经声明了了类A、类B和类C,那么可以这样来声明派生类D:class D: public A, private B, protected C{ //类D新增加的成员}多继承的构造函数多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的原创 2017-06-02 21:47:58 · 732 阅读 · 0 评论 -
gperftools使用
近期尝试使用gperftools对C++内存泄露进行排查,所以对gperftools进行了一些了解。gperftools是google用来进行程序性能优化的工具集合,主要包括tcmalloc和profiler两个库。其可以提供如下的功能:tcmalloc:与glibc中的malloc函数相比,tcmalloc的内存分配效率要远高于malloc,可以提高高并发的性能 ,降低系统的负载cpu pro原创 2017-07-15 13:27:24 · 2577 阅读 · 0 评论 -
STL中的swap函数
swap函数执行会调用容器内数据类型的,拷贝构造和赋值函数调用对自定义类型使用STL algorithm中的swap函数,会调用自定义的类型的拷贝构造函数一次,赋值函数两次;自定义类型中没有定义那么就会使用默认的拷贝构造函数和赋值函数。 如果是容器,那么会遍历容易进行赋值。swap函数可用于清空vector和string类型容器分配的内存空间对于vector, string, basic_strin转载 2017-07-15 15:39:21 · 4748 阅读 · 0 评论 -
函数对象
函数对象(Function Object)又称函数对象类、仿函数、高阶函数等,函数对象实际上是指那些可以被传入其他函数或是从其他函数返回的函数(比如std::for_each函数的第3个参数就要求传入接受一个参数的函数或函数对象),是不是和函数指针的作用很相似,后面会介绍函数对象和函数指针的差别~ 感觉上面关于函数对象的定义还是好复杂呀,通俗的讲函数对象就是一个重载了operator()操作符的类转载 2017-07-24 17:06:04 · 650 阅读 · 0 评论 -
C++11之左值、纯右值和将亡值
在C++11中所有的值一定属于左值、纯右值和将亡值三种值之一,分别介绍一下这三种类型。左值与右值在C++中定义左值与右值的比较标准的方法是根据其可以取地址来判断。左值就是可以对变量进行取地址或者有名字的变量,按照C语言中的规定也就是说其在内存中是被分配了位置;而右值就是不可以取地址、没有名字的。比如 a = b + c;其中a就是左值、b+c就是右值。纯右值与将亡值纯右值就是C++98中的右值的概念原创 2017-09-03 12:33:10 · 3305 阅读 · 0 评论 -
C++11之POD类型
什么是POD类型POD的全称叫做Plain Old Data,简单讲就是一个类或者一个结构体通过二进制拷贝之后还能保持其不变,那么这个类型就是POD类型。什么类型属于POD类型当一个类型具有平凡的定义和标准布局这两种情况时,才可以说这种类型是POD类型。什么是平凡的定义的类型当一个类具有以下的几个定义时,才可以说是平凡的类:拥有平凡的默认构造函数和析构函数 这里的平凡的默认构造函数是指在不定义构原创 2017-08-27 14:47:42 · 612 阅读 · 3 评论 -
C++11之初始化成员变量
C++98中的成员变量初始化在声明类的时候,对于静态类型并且是常量类型,同时是枚举或者是整型的变量可以使用=在声明时初始化。对于不符合上述要求的静态变量可以在类外使用=进行初始化对于非静态类型可以说个初始化列表进行初始化使用()对自定义类型进行初始化使用{}对元素集合统一初始化C++11中的成员变量初始化在C++11中可以使用=或者{}就地初始化,类似于Java语言。 代码示例stru原创 2017-08-27 17:53:08 · 10874 阅读 · 0 评论 -
C++11之lambda函数
最近一直在看mesos的源代码,mesos中用到了很多C++11的新特性,lambda函数就是其中的一个。对于lambda函数简单的来说就是java中的匿名函数。语法定义[capture] (paramenters) mutable->return-type {statement}[capture] 捕捉列表:捕捉上下文中的变量供函数使用(paramenters) 参数列表:跟普通参数列表相同,原创 2016-11-07 21:14:41 · 639 阅读 · 1 评论 -
使用libcurl异步发送http请求
在工作中需要完成一个工具,该工具主要的用途就是向指定的服务器和端口发送http请求,为了提高性能,采用多线程的方式进行,同时采用libcurl的异步形式。代码如下,在其中添加一些注释来记录写代码中遇到的问题。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <stdarg.h原创 2017-10-09 21:02:46 · 4932 阅读 · 0 评论 -
C++重载、重写、重定义区别
重载(overload)概念:函数有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数之间,互相称之为重载函数。基本条件:函数名必须相同; 函数参数必须不相同,可以是参数类型或者参数个数不同; 函数返回值可以相同,也可以不相同;注意:只能通过不同的参数样式进行重载,例如:不同的参数类型,不同的参数个数,不同的参数顺序; 不能通过访问权限、返回类型、抛出的异常进行重载;重载的转载 2017-08-27 19:51:41 · 365 阅读 · 0 评论 -
命名空间
命名空间的作用命名空间是为了防止名字冲突提供更加可控的机制。命名空间分割了全局命名空间,其中每一个命名空间是一个作用域。命名空间的定义命名空间由三部分组成,分别是namespace、空间名字和一系列由花括号括起来的声明和定义。只要能出现在全局作用域中的声明都能置于命名空间中,例如:类、变量(及其初始化操作)、函数(及其定义)、模板和其他命名空间等。命名空间的定义既可以定义在全局变量的作用域内,也可以原创 2017-05-27 17:46:14 · 1711 阅读 · 1 评论 -
map/unordered_map原理和使用整理
结论新版的hash_map都是unordered_map了,这里只说unordered_map和map.运行效率方面:unordered_map最高,而map效率较低但 提供了稳定效率和有序的序列。占用内存方面:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在转载 2017-04-07 16:16:17 · 2478 阅读 · 0 评论 -
C++中间结果溢出
在C++中有可能因为数据的值超出了数据类型所表示的范围而造成错误地结果,下面来详细分析一下。有如下代码:short int a = 234;short int b = 456;short int c = 6;cout << a * b / c;//结果为17784如果short int占用2字节,int占用4字节。虽然short int为16位整数,但是由于该指令系统是32位,放在在32位的寄原创 2017-05-22 22:09:54 · 1481 阅读 · 0 评论 -
Linux应用编程之静态链接库和动态链接库
静态库与动态库通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。 其转载 2016-10-22 13:31:11 · 542 阅读 · 0 评论 -
Mesos中实现线程安全
近期,在研究mesos 0.10.0版本的代码,对于mesos代码结构又有了一部分新的认识。在阅读有关executor的那部分代码时,感觉其中有一部分代码很基础,但是,开发很巧妙的拆分了代码的结构,避免了在开发代码时带来的问题。首先是代码中的一部分注释如下:/** * Concrete implementation of an ExecutorDriver that connects an *原创 2016-10-22 16:44:13 · 508 阅读 · 1 评论 -
do{...}while(0)在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:#define __set_task_state(tsk, state_value) \ do { (tsk)->state =转载 2016-11-27 15:30:41 · 431 阅读 · 0 评论 -
strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点:strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。 函数原型:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。 函数原型:void *me转载 2016-11-26 16:59:00 · 240 阅读 · 0 评论 -
智能指针
一直都知道智能指针是依靠引用计数的原理实现的,但是,自己一直都没有尝试自己实现一个简单的指针指针,最近尝试自己写了一个智能指针的类,进行了简单的测试,不知道会不会有bug,代码如下:SmartPointer.h#include <iostream>template <typename T>class SmartPointer{ public: //构造函数 SmartPoi原创 2016-12-26 08:33:07 · 363 阅读 · 0 评论 -
C++中两个类互相包含
今天突然想起一个C++的问题,如果一个类A包含类B的实例,而实例B也包含另一个类A,这种方式的代码应该怎么写,按照一般的开发者的想法的代码如下:文件A.h#include "B.h"#include <iostream>using namespace std;class A{public: int i; B b;}文件B.h#include "A.h"#include <i原创 2017-01-08 12:52:50 · 8912 阅读 · 1 评论 -
Makefile讲解
最近接触到很多C++项目,其中很多项目中含有大量的Makefile文件,但是由于环境的不同Makefile也带来了很多问题,所以决定以ice中的多个Makefile文件为例进行了介绍,ice中的文件结构如下:.├── BuildInstructions.md├── BuildInstructionsAIX.md├── BuildInstructionsLinux.md├── BuildIns原创 2017-01-21 19:04:02 · 310 阅读 · 0 评论 -
引用计数与垃圾收集之比较
本质上来说,引用计数策略和垃圾收集策略都属于资源的自动化管理。所谓自动化管理,就是在逻辑层不知道资源在什么时候被释放掉,而依赖底层库来维持资源的生命期。而手工管理,则是可以准确的知道资源的生命期,在准确的位置回收它。在 C++ 中,体现在析构函数中写明 delete 用到的资源,并由编译器自动生成的代码析构基类和成员变量。所以,为 C++ 写一个垃圾收集器,并不和手工管理资源冲突。自动化管理几乎在所转载 2017-03-22 10:40:24 · 407 阅读 · 0 评论 -
C++11之继承构造函数
问题场景类的继承中,如果子类想使用父类的构造函数,则需要在子类的构造函数中声明使用父类的构造函数,例子如下:struct A{ A(int i){}};struct B:A{ B(int i):A(i),d(i){} int d;};但是如果父类中含有多种版本的构造函数,那么子类的构造函数需要多种版本的实现,实现起来很不方便。如下例子:struct A{ A(int i)原创 2017-12-08 12:06:44 · 406 阅读 · 0 评论