
C/C++
文章平均质量分 77
amoscykl
Casablanca!
展开
-
C++继承中的重载,覆盖和隐藏
谈谈C++继承中的重载,覆盖和隐藏 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。 我们先来看一些代码及其编译结果。 实例一: #include "stdafx.h" #include <iostream.h> class CB { public: void f(int) { ...原创 2018-06-04 22:09:05 · 490 阅读 · 0 评论 -
C++中static关键字的作用
1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("Hello\n");...原创 2019-02-19 00:22:47 · 612 阅读 · 0 评论 -
手写函数:strlen(), strcpy(), strstr(), strcat(), strcmp(), memcpy()
strlen()函数功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内 实现:int strlen(const char *str) { assert(str != NULL); int len = 0; while( (*str++) != '\0') len++; return len;} strcpy()函数功能:...原创 2019-01-08 19:12:02 · 1913 阅读 · 2 评论 -
C/C++: new和malloc的区别
属性new/delete是C++操作符,需要编译器支持。malloc/free是库函数,需要头文件支持。 参数使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。int *a = new int();int *a = malloc(sizeof(int)); 返回类型new操作符内存分配...原创 2019-01-03 11:05:34 · 407 阅读 · 0 评论 -
STL中内存池的实现
STL里的内存池实现STL内存分配分为一级分配器和二级分配器,一级分配器就是采用malloc分配内存,二级分配器采用内存池。二级分配器设计的非常巧妙,分别给8k,16k,..., 128k等比较小的内存片都维持一个空闲链表,每个链表的头节点由一个数组来维护。需要分配内存时从合适大小的链表中取一块下来。假设需要分配一块10K的内存,那么就找到最小的大于等于10k的块,也就是16K,从16K的...原创 2019-01-06 00:53:44 · 4263 阅读 · 4 评论 -
C++内存管理
在C++中内存分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。堆:堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。栈: :局部变量,函数参数等存储在该区,由编译器自动分配和释放。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放...原创 2019-01-05 17:28:31 · 349 阅读 · 0 评论 -
C++虚函数表详解
C++的虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖(override)的问题,保证其能真实的反应实际的函数。这样,在有虚函数的类的实例中这张表被分配在了这个实例的内存中,所以当我们用父类的指针操作一个子类的时候,这张虚函数表就显得尤为重要了,他就像一个地...原创 2019-01-05 09:51:57 · 12600 阅读 · 3 评论 -
C++多态性与虚函数
1.什么是多态?(1)通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。(2)多态是面向对象的重要技术之一,它是一种行为的封装,是同一个事物所表现出来的多种形态,简单地说就是:一个接口、多种形态。(3)在运行时使用同一个成员名来调用类对象的成员函数,会调用哪个对象的成员函数呢?这就是多态要解决的问题! ...原创 2019-01-04 00:00:06 · 523 阅读 · 0 评论 -
boost::bind()详解
使用boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式。其可以支持函数对象、函数、函数指针、成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置。 1. 通过functions和function pointers使用bind给定如下函数:int f(int a, int b){ return a + ...原创 2018-10-25 20:50:18 · 739 阅读 · 0 评论 -
boost::function用法详解
今天学习muduo网络库源码的时候看到了boost::function,写篇笔记记录下。 书上是这样描述的:function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛华,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此,它可以被用于回调机制,暂时保管函数或函数对象,在之后需要的时机在调用,使回调机制拥有更...原创 2018-10-25 20:36:47 · 2118 阅读 · 0 评论 -
线程池的原理及C++线程池的封装实现
线程池原理介绍线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。线程池的组成部分:线程池管理器(ThreadPoolManager):用于创建并管理线程池 工作线程(WorkThread): 线程池中线程 任务接口(Task):每个任务必须实现的接口...原创 2018-10-08 17:24:04 · 4498 阅读 · 0 评论 -
为什么C++中stack的pop()函数不返回值而返回void
C++中stack,其中有两个方法:pop(), 返回void,top(),返回栈顶的引用。看起来pop函数非常的浪费,为什么pop不再是返回值呢。我收集到两个原因:1.安全原因:假设有这个stack类class Stack{ public: T pop(); //let pop to change the stack's internal...原创 2018-10-12 09:35:57 · 5720 阅读 · 2 评论 -
为什么多线程读写 shared_ptr 要加锁? --shared_ptr的线程安全性
在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_...原创 2018-06-06 17:51:04 · 1091 阅读 · 0 评论 -
C/C++ 字节对齐问题
字节对齐的原因 为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐。对齐方式 对于 struct 或 union 中的 struct 或者 union 来说,它们的字节对齐标准就是它的所有成员中字节数最大的数据的字节数。一般情况下 C/C++ 的变量所占用的字节数 char: 1字节; ...原创 2019-02-19 11:53:39 · 438 阅读 · 0 评论