![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 62
DOOM
这个作者很懒,什么都没留下…
展开
-
C+++TIP
某个类只改了CPP,没改hpp,那么只需重新编译这个类,包含此类的hpp的其他类不需要重新编译。编译只是需要确定大小,变量和函数的位置。栈的时间性能高,因为栈采用后入先出(FIFO)的方式,非常适合函数调用时临时变量的新建与撤销,即时间复杂度很小。而如果将变量存放在堆上,它们是通过链表链接的。分配内存时要查找一个含有用户申请单元数的链表块,因此相对栈来说延时较大避免使用虚函数作为库的接口原创 2011-10-12 13:34:42 · 802 阅读 · 0 评论 -
利用Thunk让C++成员函数变回调函数
Windows API经常需要回调函数,而在C++开发中面向对象当行其道,若能让C++类的成员函数成为回调函数,简直就是大善!但是C++成员函数都隐含了一个this指针用于指向当前的对象。要实现回调确实不容易。 我大约一年前就接触到Thunk技术,甚至也看过利用Thunk实现将成员函数变成回调函数的例子。但是我实在没了解过C++汇编后的样子,很容易钻了牛角尖,看转载 2009-11-09 20:34:00 · 1152 阅读 · 0 评论 -
signed unsigned
char a = 64;char b = 64; a*=2;b printf("%d %d",a,b); //-128 -128 a/=2;b>>=2;printf("%d %d",a,b);//-64 -64 逻辑移位不考虑符号位,算术移位考虑符号位。c/c++中有符号数的右移都是算术移位,左移是逻辑移位。 unsingned和sign原创 2009-11-01 15:52:00 · 579 阅读 · 0 评论 -
struct 中的member variable 的offset的宏定义
struct 中的member variable 的offset的宏定义#define offsetof(s,m) (size_t)&reinterpret_cast((((s *)0)->m))定义:#define offsetof(type, f) ((size_t) ((char *)&((type *)0)->f - (char *)(type *)0))解释:转载 2009-11-01 22:06:00 · 2614 阅读 · 0 评论 -
预处理器操作符:#,#@,##
#:字符串化操作符。该操作符与#define宏一块使用。例如:#define to_string(s) #s 编译器将把cout 转换为:cout 其中,to_string可以是任意自定义的名称。如果参数s中有多个连续的空格,则输出的结果与预想的则会有差别。#@:字符化操作符。该操作符与#define宏一块使用。例如:#d转载 2009-10-31 16:18:00 · 815 阅读 · 0 评论 -
__declspec关键字详细用法
__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。用法:__declspec ( extended-decl-modifier )转载 2009-10-31 16:17:00 · 875 阅读 · 0 评论 -
typedef关键字详解
1.为语言即定义的类型或自己声明的类型构建一个简短或更有意义的别名。typedef不是新建了一种类型而仅仅是为已知类型起个别名。2.不能在函数定义内部使用typedef。3.不能使用typedef为类声明的新名字用作类的构造函数和析构函数名。4.typedef可以为同一类型重复声明。但不能为不同类型声明相同名称。例1:// FILE1.Htypedef char原创 2009-10-31 12:29:00 · 788 阅读 · 0 评论 -
C++库汇总
基础类1、Dinkumware C++ Library参考站点:http://www.dinkumware.comP.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr.Dobbs程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C++的产品中采用Dinkum转载 2009-10-31 16:55:00 · 558 阅读 · 0 评论 -
extern "C"详解
C++语言的创建初衷是“a betterC”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有转载 2009-10-31 16:53:00 · 515 阅读 · 0 评论 -
C与C++的语法区别总结
1.在C++中,for语句中可以出现for(int i=0;i2.在C++中定义struct,union和enum类型的变量时,关键字struct,union和enum可以省略;在C中不能忽略。3.在C++中,可以用const类型的整数作为数组的大小,而在C中不可以。4.在C中,const类型的变量是对外可见的,所以只能出现在源文件中;而在C++中,const类型的变量只有内部可见,转载 2009-10-31 16:14:00 · 1586 阅读 · 0 评论 -
虚继承与虚基类
虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。转载 2009-11-08 01:33:00 · 663 阅读 · 0 评论 -
public、protected和private继承
网上找了很多关于c++中这三者在继承方面的文章,貌似都不够全面。将几篇我觉得不错的文章整合了一下,方便大家查阅。 首先贴一个转载比较多的帖子:http://blog.csdn.net/wuliming_sc/archive/2009/01/18/3827743.aspx 在C++中继承主要有三种关系:public、protect转载 2009-11-09 20:30:00 · 11220 阅读 · 0 评论 -
C puzzles
AuthenticationLogin with:New JS-Kit accountGoogle Friend ConnectTwitter accountFriendFeed accountYahoo accountBlogspot URLJS-Kit accountHaloscan accountOpenID<!--转载 2009-11-11 20:24:00 · 754 阅读 · 0 评论 -
lua使用 tinycc
1.下载tinycchttp://bellard.org/tcc/http://repo.or.cz/w/tinycc.git 最新的2.编译tcc需要mingw进入 tinycc/win32运行build-tcc.batwin32/libtcc 下面是 libtcc.a 和 libtcc.hwin32 下面是tcc.exe 和 libtc原创 2012-04-20 15:39:05 · 10727 阅读 · 0 评论 -
TCMalloc:线程缓存的Malloc
转载自:http://shiningray.cn/tcmalloc-thread-caching-malloc.html原文翻译:ShiningRay转载 2011-07-13 11:24:49 · 734 阅读 · 0 评论 -
模板用于解耦
陈硕的题和解决方法:一道 C++ 思考题:std::string 的 operator > 是如何声明的,如何避免与 iostream 的过度耦合?iostream 和 string 都可以单独 include 来使用,显然 iostream 头文件里不会定义 string 的原创 2011-07-11 01:05:43 · 840 阅读 · 0 评论 -
大端模式与小端模式、网络字节顺序与主机字节顺序
1. 大端模式与小端模式1.1 概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB: Most Significant Bi转载 2011-07-08 10:31:16 · 652 阅读 · 0 评论 -
多重继承中函数同名
http://blog.csdn.net/xiaohyy/archive/2004/07/09/38167.aspx当两个接口中有相同的函数声明名,比如:interface IA{ virtual void Fun()=0;};interface IB{ virtual void Fun()=0;};类CD继承这两个接口:class CD :转载 2011-06-15 15:55:00 · 1035 阅读 · 0 评论 -
【转帖】Coroutines in C(C语言中的协程)(本文很可能就是freertos中协程的奠基性文章!)
tp://www.chiark.greenend.org.uk/~sgtatham/coroutines.htmlby Simon Tatham 翻译:jimieweileIntroduction介绍Structuring a large program is always a difficult job. One of the partic转载 2011-06-10 09:19:00 · 5319 阅读 · 0 评论 -
switch-case 非常规用法拾零
<br />http://bbs.chinaunix.net/thread-1833313-1-1.html<br />0. 前言<br />以下介绍的两个大牛都是利用了 switch 语句中的 case 部分可以置于一个<br />block (通常是 if{} 或 while{} 块)中, switch 语句执行一个直接跳转进入该<br />block,进入该 block 的条件有时候被有意地忽略。<br /><br />全文思路和代码绝无原创之处,只是略加整理了一下。更详细的请看提供的转载 2011-05-30 09:23:00 · 2123 阅读 · 1 评论 -
C++中的类如何防止被继承
<br />C++中如何使类不能继承<br />转自(http://blog.163.com/austin_125/blog/static/17824292200910745038396/)<br /> 如何使类不能被继承<br /> 如果大家熟悉java的话应该知道java中有一种类不能被继承,那就是final类.这种类有很多用处,尤其是在大的项目中控制类的继承层次. 使子类数量不至于爆炸.在使用了多继承的类层次中这也是防止出现菱形继承层次结构的一个好办法. 要实现一个不能被继承的类有很转载 2011-03-23 17:15:00 · 943 阅读 · 0 评论 -
PIMPL IDIOM & FAST PIMPL
PIMPL是C++开发中经常使用的一种惯用法,其原理主要是将对定义的依赖转换为对声明的依赖,通过前向声明,达到接口与实现的分离的效果,并将编译时文件间的依赖降到最低,从而大大缩短程序编译的时间。PIMPL的实现方式,第一种是让实现类成为接口类的一个私有指针成员变量比如一个数据访问类DataAccess, // DataAccess.h#include "DataAccessFWD.转载 2010-01-26 02:07:00 · 2157 阅读 · 0 评论 -
DSP程序优化方法
1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。转载 2009-11-04 23:15:00 · 1097 阅读 · 0 评论 -
对C/C++中多维数组指针的理解
#include "stdafx.h"#include "stdio.h"#include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /* 定义一个3行4列的二维数组 */转载 2009-10-24 11:25:00 · 619 阅读 · 0 评论 -
volatile
The volatile keyword specifies that the value associated with the name that follows can be modified by actions other than those in the user application. Therefore, the volatile keyword is转载 2009-10-17 00:20:00 · 654 阅读 · 0 评论 -
如何理解C run-time library (C运行时库/CRT)
注: 以下内容部分引自CSND中相关讨论的帖子,并结合自己的理解整理而成。仅供参考。1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.2)C 语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C 语言内核开发出来之后,Dennis Ritch转载 2008-09-15 19:19:00 · 742 阅读 · 0 评论 -
用自定义类声明全局变量的一种快捷方式
用自定义类声明全局变量的一种快捷方式在Statistics.h的最后添加“extern CStatistics Statistics;” 在Statistics.cpp的最前面添加“CStatistics Statistics;” 在别的c文件中#include "Statistics.h"就可直接使用Statistics全局变量了,真方便。theApp就是这样声明的。转载 2008-06-13 13:58:00 · 694 阅读 · 0 评论 -
#pragma pack(n)也谈内存对齐
在最近的项目中,我们涉及到了“内存对齐”技术。对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原转载 2008-06-13 14:02:00 · 667 阅读 · 1 评论 -
Bjarne Stroustrup's C++ Style and Technique FAQ
These are questions about C++ Style and Technique that people ask me often. If you have better questions or comments on the answers, feel free to email me (bs@research.att.com). Please remember that I转载 2008-06-12 02:50:00 · 772 阅读 · 0 评论 -
谈谈C++继承中的重载,覆盖和隐藏
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一: #include "stdaf转载 2008-06-12 16:46:00 · 547 阅读 · 0 评论 -
C复杂声明解析
复杂的C声明一般被认为不是很好的编程习惯,当然也就不推荐使用。但是在读很多前辈遗留的代码时,又不得不面对这一问题。知道总比不知道好,我们还是来看看分析复杂C语言声明的规则吧,用例子分析最直观。一、“right-left”规则看过《C专家编程》中的分析规则,用起来并不是很舒服,遂在网上寻找,发现还有一个著名的“right-left”规则。规则经翻译总结后如下:“right-left”规则转载 2008-06-12 03:51:00 · 913 阅读 · 0 评论 -
类成员CALLBACK函数 或 线程函数 访问 类成员变量
CALLBACK函数要声明称 static或全局,而在静态的函数中药调用非静态成员还不能调用,必须把这些成员也设置成静态的,不怎么方便,有好的解决方法吗。其原因是把CALLBACK函数封装成C++类的非静态成员后,需要有建立对象,再通过对象才能去找到这个成员函数。而系统调用这个CALLBACK函数的时候,才不管你有没有建立对象呢。典型的解决方法是需要用静态成员函数给系统CALL。然后设法把转载 2008-05-26 23:17:00 · 1660 阅读 · 1 评论 -
什么是回调函数(callback)
回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。 那么我们就把foo称为回转载 2008-05-26 23:04:00 · 779 阅读 · 0 评论 -
判断32位整数二进制中1的个数
在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化。现在整理一下: 1、基本思路: #include iostream> using namespace std; int findone(unsigned int n)...{ for(int i=0;n>0;n>>=1) i+=(n&1); return i; } int main(转载 2008-05-22 14:39:00 · 2462 阅读 · 0 评论 -
指向 类成员函数 的 函数指针
原文:http://www.vckbase.com/document/viewdoc/?id=1818一、成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明转载 2008-05-08 19:18:00 · 6246 阅读 · 2 评论 -
编译后的.bss段 .data段 .text段
BSS段在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段在采用段转载 2008-09-15 20:56:00 · 2036 阅读 · 0 评论 -
#pragma once与 #ifndef的区别
为了避免同一个文件被include多次 1 #ifndef方式 2 #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句 #endif方式二:#pra转载 2008-06-27 13:56:00 · 737 阅读 · 0 评论 -
memcpy实现
void * MyMemcpy(void *memDest,const void *memSrc,size_t size){ assert((memDest!=NULL)&&(memSrc!=NULL)&&size > 0); char *tempDest=static_cast(memDest); const char *tempSrc=stat原创 2009-09-24 00:20:00 · 760 阅读 · 0 评论 -
const 阅读 理解
咱们来对比一下这5个东西:char ** a;const char ** b;char * const * c;const char * const * d;const char * const * const e;——天哪,这都是什么东西?用5个小程序来解释一下。。或许你可以看得懂?如果你急着和mm去约会,直接跳到文转载 2009-09-29 00:14:00 · 615 阅读 · 0 评论 -
十六进制 字符串 赋值到 byte
bool strtobyte(const char* source, byte* dest,const unsigned int& destsize) { if (strlen(source) % 2 || strlen(source)/2 > destsize) { return false;原创 2008-10-10 21:06:00 · 1924 阅读 · 0 评论