![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 79
Shawn_Mei_
---
展开
-
glibc中malloc()的空间overhead
在linux下调用malloc()分配内存的时候,实际占用的内存与请求的内存尺寸的关系是什么呢,这个需要研究一下glibc中malloc()的实现。现在常见linux发行版中带的glibc中采用的都是Doug Lea的实现,下面的分析取自他的2.8.4版本的malloc.c。glibc对内存的管理是以chunk为单位的,未分配的chunk之间用双向链表连接成一个环,遍历的时候用指针遍历,已分配的chunk在其首部有chunk的大小,并以此字节数做遍历。每个chunk的首部要放置一个叫做malloc_ch转载 2021-05-23 11:28:22 · 364 阅读 · 0 评论 -
建议使用强枚举类型
枚举量声明、定义、使用众所周知,C/C++ 语言可以使用 #define 和 const 创建符号常量,而使用 enum 工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下 enum 的使用方法。步骤(一)——枚举量的声明和定义(1) 首先,请看下面的语句:enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};这句话有两个作用:...转载 2020-07-24 10:30:35 · 361 阅读 · 0 评论 -
C++ "free store" VS "heap"
当我问你C++的内存布局时,你大概会回答:“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。如果我接着问你自由存储区与堆有什么区别,你或许这样回答:“malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。”这样听起来似乎也没错,但如果我接着问:自由存储区与堆是两块不同的内存区域吗?它们...转载 2020-05-06 14:19:05 · 620 阅读 · 0 评论 -
C/C++内存管理详解
https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/转载 2020-01-19 15:21:28 · 169 阅读 · 0 评论 -
c++ 匿名命名空间与static全局变量
https://www.cnblogs.com/youxin/p/4308364.htmlhttps://blog.csdn.net/Solstice/article/details/6186978转载 2019-11-15 10:57:13 · 1651 阅读 · 0 评论 -
c++虚函数表
先写个例子 为了探索C++虚函数的实现,我们首先编写几个用来测试的类,代码如下: C++ #include <iostream>using namespace std;class Base1{public: virtual void f() { cout << "Base1::f()" &...转载 2018-08-02 00:30:44 · 238 阅读 · 0 评论 -
C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,原创 2017-10-16 13:34:12 · 126 阅读 · 0 评论 -
第十三章 拷贝控制
c++ primer 第十三章 拷贝控制 笔记原创 2017-10-07 10:17:17 · 225 阅读 · 0 评论 -
第十二章 动态内存
程序除静态内存和栈内存,还有自由空间(free store)or 堆(heap)。 使用动态内存容易造成内存泄漏:忘记delete new分配的空间。 share_ptr类:模板。最好用make_shared函数来分配内存。shared_ptrint> p1 = make_sharedint> ();shared_ptrstring> p2 = make_sharedstri原创 2017-10-04 21:51:22 · 157 阅读 · 0 评论 -
函数返回数组指针的几种声明方式
函数返回数组指针的几种声明方式:1.直接声明:Type (*function(parameter_list))[dimension] eg:int (*func(int ))[10]; //func接受一个int实参,返回一个数组指针,指向含有10个int的数组。类型别名:typedef int Arr[10]; //用Arr这个别名代替含有10个整数的数组原创 2017-08-20 11:36:57 · 543 阅读 · 0 评论 -
类模板的模板友元函数定义
类模板的模板友元函数定义有2种方式: 1. 将友元模板函数直接定义在类模板中。这种方式比较简单直接。 2. 将友元模板函数声明在类模板中,定义在类模板之外。这种方式的写法,如果不小心,通常会出现编译没问题,链接时无法解析的错误。 以下是一个简单的正确的例子: 1 #include <iostream> 2 #include <vector> 3 4 tem...转载 2018-07-14 13:59:08 · 781 阅读 · 0 评论 -
new与delete
new 和 delete要调用的operator new 和 operator delete大概是这种形式:void * operator new(std::size_t size) throw(std::bad_alloc) { if (size == 0) size = 1; void* p; while ((p = ::malloc(size)) ...原创 2018-07-23 12:16:23 · 79 阅读 · 0 评论 -
实现自己的STL
较为完整的STL实现: https://github.com/ShawnMeiUstc/MyStl原创 2018-07-17 16:50:57 · 705 阅读 · 0 评论 -
栈帧详解
一、 什么是栈帧? 什么是栈帧,相信很多从事C编程的童鞋还是没有搞明白,首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。”。 实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。也许这样感觉更复杂了,好吧,让我们从栈开始来理解什么是栈帧…二、 栈(用户栈和内核栈) 在大学学习转载 2017-10-31 20:09:45 · 861 阅读 · 0 评论 -
值传递、指针传递、引用传递的区别
使用引用传递的好处:具有值传递的优势,可以向形参传递表达式,让编译器生成临时变量来传递地址;又具有指针传递的优势,实际传递的是地址,提高了速度与效率。值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 指针传递:形参为指...原创 2017-11-10 21:01:50 · 1563 阅读 · 0 评论 -
内联函数机制解析
以下来源:http://blog.csdn.net/fuzhongmin05/article/details/54615865内联函数机制的引入 内联机制被引入C++作为对宏(Macro)机制的改进和补充(不是取代)。内联函数的参数传递机制与普通函数相同。但是编译器会在每处调用内联函数的地方将内联函数的内容展开。这样既避免了函数调用的开销又没有宏定义机制的缺陷。由此可见,内联函数机制原创 2017-12-13 15:07:07 · 448 阅读 · 0 评论 -
借由function类和bind函数实现多态
一、 std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹#include < functional>std::function< size_t(const char*)> print_func;// normal function -> std::function objectsize_t CP...原创 2018-08-02 13:54:26 · 1264 阅读 · 0 评论 -
c++类模板的偏特化
类模板的偏特化转载 2017-12-30 17:12:33 · 809 阅读 · 0 评论 -
stl迭代器失效
迭代器失效分三种情况考虑,也是非三种数据结构考虑,分别为数组型,链表型,树型数据结构。数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。解决方法:erase(*iter)的返回值是下一个转载 2017-12-18 10:07:14 · 170 阅读 · 0 评论 -
可变参数实现
可变参数:https://www.cnblogs.com/chinazhangjie/archive/2012/08/18/2645475.html字节对齐位运算实现:https://blog.csdn.net/fulinus/article/details/8286252C++里用initializer_list<T>模板类来函数的可变形参,省略符形参应当只用来在c++程序里...转载 2019-04-25 19:37:51 · 104 阅读 · 0 评论 -
c++随机数引擎与分布类型
一、旧式rand(): 旧式的随机数发生器沿用C的Rand()函数,这个函数会产生区间在[0,RAND_MAX]的伪随机数,且随机数近似可以看做符合均匀分布。 rand()函数的一些问题:很多程序需要不同范围的随机数;一些应用需要随机浮点数;一些程序需要非均匀分布的数;而程序员为了解决这些问题而试图转换rand生成的随机数的范围、类型或分布时,常常会引入非随机性。二、新标...原创 2018-06-27 18:32:56 · 1158 阅读 · 1 评论 -
c++ tuple
tuple是一个“快速而随意”的数据结构,当我们希望将一些数据组合成单一对象而又不想麻烦的重新定义一个数据结构时,就可以使用tuple。 tuple定义在头文件&lt;tuple&gt;中。tuple是类似pair又更泛化的模板,不像pair成员数量固定为2个,一个tuple可以有任意个类型不同的成员。#include&lt;iostream&gt;#include&lt;tuple&gt...原创 2018-06-27 17:03:50 · 767 阅读 · 0 评论 -
通用引用、引用折叠与完美转发问题
一、通用引用: 通用引用(universal reference)是Scott Meyers在C++ and Beyond 2012演讲中自创的一个词,用来特指一种引用的类型。这种引用在源代码中(“T&amp;amp;amp;&amp;amp;amp;”)看起来像右值引用,但是它们可以表现左值引用(即“T&amp;amp;amp;”)的行为。它们的双重性质允许它们绑定右值(就像右值引用那样)和左值(就像左值引用那样)。而且,它们可以绑定con...原创 2018-06-26 19:44:51 · 3161 阅读 · 0 评论 -
sizeof运算符和strlen()函数作用于c、c++风格字符串
说明: 1、strlen()函数: cplusplus.com: size_t strlen ( const char * str );Get string length Returns the length of the C string str.The length of a C string is determined by the terminating null-c...原创 2018-05-31 12:42:38 · 186 阅读 · 0 评论 -
辨认一个复杂声明表达式中变量的类型
原文:http://blog.csdn.net/y1196645376/article/details/60148192 何谓复杂声明表达式子中变量的类型?先来看看这段代码:typedef double* (*a)[10];typedef int* (*b[10])[10];typedef int(*(*c)(int,int))(int);转载 2017-11-10 09:55:06 · 208 阅读 · 0 评论 -
右值引用和移动语意
一、c++中的左值和右值 误区:左值位于等号左边,右值位于等号右边。 C++11中的定义:左值表达式表示的是一个对象的身份(在内存中的位置),而右值表达式表示的是对象的值(内容)。 左值和右值都是针对表达式而言的,左值是持久的,右值是短暂的:左值在表达式结束后仍然存在,右值在表达式结束后会被销毁。 区分左值和右值的方法:看能不能进行取地址操作,若能,则为左值,否则为右值。 注意:在需要右...原创 2017-10-10 15:22:57 · 481 阅读 · 0 评论 -
类值类与类指针类
类值类://行为像值的class A{public: A() = default; A(string s) : ps(new string(s)), i(0) {} A(const A&amp;amp; a) :ps(new string(*a.ps)), i(a.i) {} //每个类对象有自己的一份资源拷贝 A&amp;amp; operator=(const A&amp;a...原创 2018-06-20 18:02:57 · 1386 阅读 · 0 评论 -
c++输入输出缓冲区
(1)c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 对象和 and cstdio流是同步的,同步关系如下: 同步即表明我们可以在程序中混合用cout和printf或其他对应的流对。可以用std::ios_base::sync_with_stdio(false)来取消这种同步,取消后,如下程序中cout和printf就不是按...转载 2018-06-11 21:03:58 · 990 阅读 · 0 评论 -
c++笔记(二)
一、类内初始值和初始化列表的选择: 构造函数的初始化列表 与 类内成员初始化 没有谁好谁不好,谁来替代谁,两种方法可相互补充使用。类内初始化有一些好处:1、当你有多个构造函数时,如果使用初始化列表,每个构造函数都要写一遍,烦人不说,同时产生重复代码,修改易漏。如果把这些成员都用类内初始化,初始化列表就不用再列出它们了。2、类内初始化,成员之间的顺序是隐式的,会有些便利。如果使用初始化列表...原创 2018-06-11 20:34:52 · 297 阅读 · 0 评论 -
函数调用规则
一、几种调用规则: 1、_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上”@”和参数的字节数。2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变...转载 2018-06-11 17:16:43 · 1075 阅读 · 0 评论 -
c++引用与指针的区别及引用的底层实现
引用的特点: ①一个变量可取多个别名。 ②引用必须初始化。 ③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。使用引用时须注意: (1)&amp;在这里不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他...原创 2018-05-28 20:54:51 · 1528 阅读 · 0 评论 -
C++分离式编译与模板
一、分离式编译 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件)文件格式,并且本身包含的就已经是二进制码,但是不一定能够...原创 2018-06-04 11:27:45 · 170 阅读 · 0 评论 -
重载运算符
重载运算符参数数量一般和运算符作用的运算对象数量一样多,作为成员函数的重载运算符其显式参数数量比运算对象总数少一。重载运算符本质是一次函数调用,求值顺序一般不会保留,所以不应该重载逻辑与、或以及逗号和取地址运算符(&amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; || , &amp;amp;amp;amp;amp;)。算术或位运算最好配套其符合赋值运算符。成员or非成员: (1)成员:有些必须是,还有些改原创 2017-10-18 16:46:00 · 387 阅读 · 0 评论 -
数组与指针
一、数组和指针: 编译器为了简化对数组的支持,实际上是利用指针实现了对数组的支持。具体来说,就是将表达式中的数组元素引用转化为指针加偏移量的引用。 我们写了这样的语句int a; a = 3; 编译器为了完成这两句代码,首先在编译过程中要创建一个符号表,样子大概如下图: 然后在运行过程中,编译器发现a=3这句代码时,会在符号表里找a对应的地址,然后把3放入对应的地址,即这里...原创 2018-06-01 11:19:56 · 227 阅读 · 0 评论 -
宏(#define)与(inline)函数以及const常量的区别
宏:宏概念: C++ 宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。宏书写形式: #define &amp;amp;lt;宏名&amp;amp;gt;(&amp;amp;lt;参数表&amp;amp;gt;) &amp;amp;lt;宏体&amp;amp;gt;宏与函数的区别:时间上考虑:1:宏只占编译时间,函数调用则占用运行时间(分配单元,保存现场,值传递原创 2018-04-26 20:41:55 · 370 阅读 · 0 评论 -
c++笔记(四)
一、默认情况下,c++假定通过作用域运算符访问的名字只是名字而不是类型:/*T是一个模板类型参数,式子解释为:类T的static成员value_type与p相乘*/T::value_type * p; 如果希望使用一个模板参数的类型成员,必须显式告诉编译器该名字是一个类型,使用typename关键字:/*T是一个模板类型参数,式子解释为:类T中有个typedef的类型成员value_...原创 2018-07-01 17:14:29 · 134 阅读 · 0 评论 -
c++关键字
1.1 inline定义内联函数,该关键字是基于定义的。如果只在函数声明时给出inline,则函数不会被认为是内联函数,所以必须在函数定义的地方也加上inline。其主要特性:一个函数若声明inline,则每处声明都必须保证是inline,类成员函数若在类定义内给出定义,则隐含inline。声明定义内联函数时,编译器将所调用的代码嵌入到主调函数中。编译器在必要或更符合预期的目标代码质量...原创 2018-06-11 10:12:10 · 261 阅读 · 0 评论 -
c++笔记(一)
默认情况下,const对象仅在文件内有效,多个文件出现同名const变量,视为不同文件分别定义的独立变量。若要在不同文件间共享const对象,需加extern关键字。...原创 2018-06-11 09:45:51 · 234 阅读 · 0 评论 -
c++笔记(三)
一、原创 2018-06-25 14:56:06 · 110 阅读 · 0 评论 -
类的const成员函数的调用问题
类的对象(object)可以是const和non-const的,但是都可以调用const成员函数,其中non-const object既可以调用const member function也可以调用non-const member function,而const object只能调用const member function。 原因: 假定我们可以显示写出成员函数的this参数。class A{原创 2017-11-30 12:25:48 · 1623 阅读 · 0 评论