c++那些事
文章平均质量分 68
nodeathphoenix
这个作者很懒,什么都没留下…
展开
-
new operator的工作原理
一、new operator的工作原理 当调用一个new operator的时候,其实编译器会做三件事情: 1、为对象分配内存 2、在已经分配的内存上初始化对象 3、返回对象类型指针,程序可通过此指针访问新生成的对象那么1中是如何分配内存的呢?其实是new operator调用了函数operator new来完成的。而且new operator调用函原创 2014-01-13 14:03:59 · 946 阅读 · 0 评论 -
聚合体Aggregate
什么是聚合体呢?英文表述为原创 2014-07-11 00:20:45 · 1569 阅读 · 0 评论 -
C++函数异常说明
为了能够编写适当的catch子句,了解一个函数是否抛出异常或会抛出哪些异常对函数的用户来说是很有帮助的。而我们可以通过 异常说明 进行对一个函数的异常进行说明, 如果函数抛出异常,被抛出的异常将是包含在该说明中的一种或是从列出的异常中派生的类型。异常说明有如下的几种形式:1. 指定异常T funNname( parameterlist ) throw( T1, T2,····,转载 2014-10-14 11:24:49 · 1559 阅读 · 1 评论 -
Google C++编程命名约定
1. 总体规则:不要随意缩写;2. 宏、枚举等使用全部大写+下划线;3. 变量(含类、结构体成员变量)、文件、命名空间、存取函数等使用全部小写+下划线,类成员变量以下划线结尾,全局变量以g_开头;4. 普通函数、类型(含类与结构体、枚举类型)、常量等使用大小写混合,不含下划线;5. 参考现有或相近命名约定。 命名约定最重要的一致性规则是命名管理,命名风格直接可以直接确定命名实转载 2013-12-05 11:26:37 · 1112 阅读 · 0 评论 -
跟我一起写 Makefile
概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人转载 2011-07-14 06:48:20 · 956 阅读 · 0 评论 -
Unicode 字符集与它的编码方式
正式内容开始之前,我们先来了解一个基本概念,编码字符集。 编码字符集:编码字符集是一个字符集,它为每一个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 004116 和字符“”的编码为 20AC16。Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。 1 ASCII码原创 2011-12-09 17:26:56 · 28769 阅读 · 0 评论 -
Internal Linkage和External Linkage
LinkageTo understand the behavior of C and C++ programs, you need to know about linkage. In an executing program, an identifier is represented by storage in memory that holds a variable or a compile转载 2015-03-17 12:48:51 · 1030 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一转载 2015-04-24 14:30:38 · 557 阅读 · 0 评论 -
delete [] 时如何知道数组长度
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?…如果你对这些问题都有疑问的话,不妨转载 2014-09-30 11:17:21 · 5969 阅读 · 0 评论 -
malloc 函数工作机制
malloc()工作机制malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释转载 2014-09-17 10:59:16 · 1794 阅读 · 0 评论 -
类图,聚合和组合的区别
一直以来,对UML的东西总是模棱两可,对于类图中的聚合和组合,知道两种的区别,但过一段时间后总是分不清两者谁是谁,唉,主要怪自己的语文没有学好,呵呵!其实,对于聚合和组合,如果换成英文,就很好理解了:聚合就是“has-a”,组合就是“contains-a”。聚合是空心的菱形;组合是实心的菱形(这个比较好理解,实心的肯定比空心的扎实,哈哈)。摘录一段话:聚合和组合的区别在于:聚合关系转载 2012-07-03 09:37:21 · 5226 阅读 · 2 评论 -
extern 关键字
一 extern 声明一个外部变量:外部变量是指在调用点所在函数或者文件外部定义的全局变量。二 extern 定义或声明外部函数:外部函数的概念和外部变量类似,是指在调用点所在函数或者文件外部定义的函数。a. 定义函数时,在函数返回值类型前面加上extern关键字,表示此函数是外部函数,可供其他文件调用。 c语言规定,定义函数时省略extern的,默认为外部函数。b原创 2012-09-14 17:06:00 · 975 阅读 · 0 评论 -
boost thread 使用类的非静态成员函数做线程函数之【原理】
大家知道,pthread_create()函数的线程函数必须是静态的函数,以标准的__cdecl的方式调用的,而C++的成员函数是以__thiscall的方式调用的,相当于一个普通函数有一个默认的const ClassType* this参数。 为数据封装的需要,我常常把线程函数封装在一个类的内部,定义一个类的私有静态成员函数来作为pthread的线程函数,通常如下:class转载 2011-10-17 14:12:16 · 3243 阅读 · 0 评论 -
C++ 初始化列表
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。struct foo{ string name ; int id ; foo(转载 2013-11-06 23:47:45 · 883 阅读 · 0 评论 -
避免物理内存碎片化
转以前的项目碰到了buddy内存分配失败的情况,虽然当前可用内存和可回收内存还有很多,但是仍然无法满足分配,经过分析是物理内存碎片化导致申请连续物理内存失败。 当linux系统持续运行很长时间没有重新启动后,系统内持续的进行页面的分配和释放,系统空闲物理内存被使用的物理内存分割开,大块的连续物理内存为0,空闲页面只能满足小数量页面的分配,此时系统可能还有很多空闲页面,但是buddy转载 2014-07-07 10:32:04 · 1235 阅读 · 0 评论 -
C语言中volatile关键字的作用
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:转载 2013-12-30 15:41:45 · 603 阅读 · 0 评论 -
C++中struct和class的区别和联系
一、 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 最本质的一个区别就是默认的访问控制,体现在两个方面: 1)默认转载 2013-05-07 19:25:56 · 813 阅读 · 0 评论 -
C++标准库与STL的关系
STL即标准模板库(Standard Template Library),它包括五大类组件:算法、容器、迭代器、函数对象、适配器。STL是C++标准库的一部分,但不是全部。C++标准库是std名字空间中的所有内容,就是那些不带.h的头文件,如、。如std::string,及IO流都不属于STL,但它们是STL兼容的,可以应用迭代器,算法等。虽然std::string和IO流也是模板类,但并转载 2014-06-21 18:18:17 · 3165 阅读 · 0 评论 -
c++文件操作详解
转载自:http://hi.baidu.com/xpayt/blog/item/9a2b3a3033f5cc9ca9018e8f.html ofstream file ("example.bin", ios::out | ios::app | ios::binary);转载 2011-08-10 14:13:33 · 1032 阅读 · 0 评论 -
vim 工具使用
1 gg 文件的首行, G 文件的尾行2 vim的自动补全功能一般使用Ctrl+n就能自动补全了,从Vim7后,C/C++的函数、变量或是类的成员,使用Ctrl+x,Ctrl+o也能自动补全。如果不全的可能项有多个,可多次按ctrl + n 选择你想要的不全项。3 split(水平分栏) vsplit(垂直分栏) #split . 将当前目录(这里的当前目录不是pwd的结原创 2011-05-24 14:41:00 · 3194 阅读 · 0 评论 -
C++和双重检查锁定模式(DCLP)的风险
转自:http://blog.jobbole.com/86392/多线程其实就是指两个任务一前一后或者同时发生。1 简介当你在网上搜索设计模式的相关资料时,你一定会找到最常被提及的一个模式:单例模式(Singleton)。然而,当你尝试在项目中使用单例模式时,一定会遇到一个很重要的限制:若使用传统的实现方法(我们会在下文解释如何实现),单例模式是非线程安全的。程序员们为转载 2016-06-13 15:18:45 · 4703 阅读 · 5 评论 -
获取struct 中的member variable 的offset的宏定义
转自:http://www.linuxidc.com/Linux/2013-01/78004.htm1.offset宏讲解#defineoffsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)对这个宏的讲解我们大致可以分为以下4步进行讲解:1>((TYPE *)0 ) 0地址强制 "转换"为 TYPE结构类型的指针转载 2016-06-16 10:52:20 · 898 阅读 · 0 评论 -
C++ Singleton模式之线程安全
转自:http://blog.csdn.net/insistgogo/article/details/9412863定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。应用场景:比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。转载 2016-06-13 15:09:19 · 1965 阅读 · 0 评论 -
C++ 全局函数std::getline
经常会用到getline来读取文件,但是发现对于c和c++的getline之前没有一个很深入的认识,这里借鉴网上的一些资料总结一下。1、在标准C语言中,getline函数是不存在的。在gcc编译器中,对标准c库进行了扩展,加入了一个getline函数。该函数的定义如下: #include ssize_t getline(char **l原创 2016-08-22 14:53:55 · 13771 阅读 · 0 评论 -
类型操作符重载
c++除了可以重载运算操作符,还可以重载类型操作符。operator TypeName(), 类型操作符,重载了此类操作符后,可以将Class类型的object当作TypeName类型的数据来使用。即相当于是一个隐式的类型转换,可以在需要TypeName类型的地方隐式地将object转换为TypeName类型(通过调用Class重载的的类型操作符operator TypeName())。原创 2017-01-16 15:27:46 · 435 阅读 · 0 评论 -
STL container trick usage
vector veci;veci.push_back(1);veci.push_back(2);veci.push_back(3);veci.push_back(4);veci.push_back(5);veci.push_back(3);veci.push_back(2);veci.push_back(3); for(vector::iterator it原创 2011-05-24 14:09:00 · 968 阅读 · 0 评论 -
boost thread usage
1 Conditionnotify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:notifyAll使所有原来在该对象上等待被notify的线程统统试图去退出wait的状态,即都去竞争等待该对象上的锁。如果其中的某一个竞争中获胜,得到了condition对象上的锁,它就会马上lock住该锁,并且退出wait函数;其它竞争中失败的wai原创 2011-10-31 10:25:33 · 817 阅读 · 0 评论 -
operator=为什么要返回一个reference to *this
一、 函数返回值说到operator=的返回值,那么先必须要说一下函数的返回值。函数的返回值用于初始化在调用函数处创建的临时对象。1、 返回引用类型 Test Fun() { return Test; } Test a = Fun(); 则经过编译器处理后伪代码大致如下:原创 2014-07-26 17:13:20 · 5552 阅读 · 1 评论 -
CRC校验、MD5、SHA1算法的概念和可靠性现状
现在网上流传最广的文件校验方式是MD5和SHA1,微软发布的操作系统现在都是采用CRC32结合SHA1发布。这三种算法中属CRC最年长,也是应用最广泛,如果不考虑碰撞的条件下,这些算法都可以发现传输或保存的信息受到的损坏或篡改,比如文件校验可以防止文件被恶意篡改,数字签名可以保护合法者不被仿冒,系统鉴权一方面要保护用户存储信息不受侵害,还需要保护信息传输过程不受干扰破坏等等,下面具体看一下。1转载 2012-11-06 10:37:20 · 5168 阅读 · 0 评论 -
SSL工作原理
关键词:SSL,PKI,MAC摘 要:SSL利用数据加密、身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证。本文介绍了SSL的产生背景、安全机制、工作过程及典型组网应用。缩略语:缩略语英文全名中文解释AESAdvanced Encryption Standard转载 2012-09-05 11:02:24 · 850 阅读 · 0 评论 -
C 标准库
C 标准库其实是一个标准。glibc 基于类unix系统的运行时库(是由一些列的库组成),它除了实现C标准库之外,还包含POSIX API。一个具体的表现是它包含了unistd.h。glibc中某些c标准库函数同时也是POSIX API。msvcrt 是一个微软的基于Windows的C运行时库。它除了实现C标准库之外,还部分添加了一些功能。例如它包含了process.h。转载 2012-12-12 21:07:52 · 1292 阅读 · 0 评论 -
Sizeof与Strlen的区别与联系
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的转载 2013-08-21 09:57:13 · 649 阅读 · 0 评论 -
c++类型转换
一 dynamic_cast ( expression )该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。dynamic_cast运算符可以在执行期决定真正的类型。如果do转载 2013-11-11 21:54:53 · 775 阅读 · 0 评论 -
c++ 函数返回引用
一,c++函数的返回分为以下几种情况 1)主函数main的返回值:这里提及一点,返回0表示程序运行成功。2)返回非引用类型:函数的返回值用于初始化在跳用函数出创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。3)返回引用:当函数返回引转载 2013-11-06 22:51:56 · 983 阅读 · 0 评论 -
c++ 前置++与后置++的区别
用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能。不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含义应该跟内置类型一样,比如,你不能通过重载+号操作符来实现两个数相乘的运算,实现需要是两个数相加的运算。本篇,我重点介绍下重载前置++和后置++的区别(前置--跟后置--类似)。 我们知道,写f转载 2016-04-21 16:42:18 · 1297 阅读 · 0 评论 -
操作符重载
在C++语言中,可以用关键字operator加上运算符来表示函数,叫做运算符重载。例如两个复数相加函数:Complex Add(const Complex &a, const Complex &b);可以用运算符重载来表示:Complex operator +(const Complex &a, const Complex &b);运算符与普通函数在调用时的不同之处转载 2012-09-08 11:00:10 · 4875 阅读 · 0 评论 -
OpenSSL 使用指南
目录 • 介绍 • 编译 • 运行 OpenSSL.exe • 算法编程 API • 介绍 OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。 1.1 SSL SSL(Secure Socket Layer) 安全协议是由 Netscape转载 2012-08-27 16:57:51 · 19542 阅读 · 6 评论 -
浅谈https\ssl\数字证书
浅谈https\ssl\数字证书 (转) 2011-01-14 09:14:52| 分类:网络 | 标签:证书 ssl 加密 私钥 密钥 |字号 订阅在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。名词解释首先解释一下上面的几个名词:https转载 2012-11-28 11:59:09 · 859 阅读 · 0 评论 -
杂项
1 关于很少使用的goto goto语句不能跨越变量的定义语句向前跳转,但向后跳过已经执行的变量定义语句则是合法的。 向前跳过未执行的变量定义语句,意味着变量可能在没有定义的情况下使用。 向后跳回到一个变量定义之前,则会使系统撤销这个变量,然后再重新创建它。 goto 确实不是太好的idea,能少用还是少用吧。 2 关于转移字符 '\原创 2013-11-08 22:03:54 · 969 阅读 · 0 评论 -
模板特化和偏特化
模板特化和偏特化C++中的模板分为类模板和函数模板·模板的特化 (1)类模板特化有时为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理.例如,stack类模板针对bool类型,因为实际上bool类型只需要一个二进制位,就可以对其进行存储,使用一个字或者一个字节都是浪费存储空间的.template class T>class stack {};转载 2014-03-20 10:49:00 · 1503 阅读 · 0 评论