
C/C++
文章平均质量分 63
caianye
这个作者很懒,什么都没留下…
展开
-
深度探索C++对象模型 关于对象的笔记
简单对象模型(Simple Object Model) 三个data members直接包含在每一个class object之中,就像C struct的情况一样。而member function 虽然含在class的声明之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实体。你即将看到:C++在布局以及存取时间上主要的额外负担原创 2010-07-28 21:29:00 · 609 阅读 · 0 评论 -
linux socket编程实现connect超时的一种方法(非阻塞)
一:创建套接字,将其设置成非阻塞状态。二:调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误。三:用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败。#include #include #include #in转载 2012-03-15 19:43:06 · 2542 阅读 · 0 评论 -
关于内存泄露
1. "只要分配了内存没有释放,就会导致内存泄漏" -- 这是我以前的理解, 是片面的. 分配了的内存,如果它的指针没有丢失,就不算是泄漏. 一般说来,为static指针变量或全局的指针变量(它们的生存期是全局的)进行内存分配,如果没有释放它,虽然这也是"not-freed blocks",但是它是"reachable"的.现代的OS会得到这些指针并去释放它.转载 2012-04-11 09:57:56 · 4921 阅读 · 0 评论 -
一个URL编码和解码的C++类
#pragma once#include #include #include using namespace std;class strCoding{public: strCoding(void); ~strCoding(void); void UTF_8ToGB2312(string &pOut, char *pText, int pLen);/转载 2012-05-03 15:33:26 · 666 阅读 · 0 评论 -
C++进行base64编码和解码
base64.cpp#include "base64.h"#include static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/";s转载 2012-05-03 15:35:27 · 1651 阅读 · 0 评论 -
频繁分配释放内存导致的性能问题的分析
现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。初步分析majflt代表major fault,中文名叫大错误,minflt代表minor fa转载 2012-05-11 14:06:52 · 706 阅读 · 0 评论 -
linux环境下的main函数传递参数的问题
对于一个在linux环境下的程序,需要传递字符串的参数,当这样执行的时候: ./test 1 2 key1=value1&key2=value2&key3=value3 发现程序出现如下的结果: 如何解释呢? 这是因为注意看我们的字符串的内容,含有“&”这个特殊的符号,这个符号在linux的shell环境下,是表示在后台运行的意思。所以出现如上的错误原创 2012-06-05 20:44:48 · 4762 阅读 · 1 评论 -
字符串形式表示的整数的范围判断
bool isIn_IntRange( string strInputNum ){ char cMaxInt[20]; snprintf(cMaxInt, sizeof(cMaxInt)-1, "%d", numeric_limits::max() ); char cMinInt[20]; snprintf(cMinInt, sizeof(cMinInt)-1,原创 2012-09-06 22:09:50 · 1154 阅读 · 0 评论 -
C++ URL encode/decode (gb2312)
就是把特殊字符,转换成对应的十六进制编码,前面加上%号。char Dec2HexChar(short int n) { if ( 0 <= n && n <= 9 ) { return char( short('0') + n ); } else if ( 10 <= n && n <= 15 ) { return char( short('A')转载 2012-05-03 15:32:40 · 2202 阅读 · 0 评论 -
C++ 学习
C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次:第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《转载 2013-01-29 21:31:37 · 622 阅读 · 0 评论 -
gdb查看内存命令
用gdb查看内存格式: x /nfu 说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量原创 2013-09-12 14:16:29 · 1092 阅读 · 0 评论 -
M进制转换成N进制思想
先把M进制转换成十进制,再把十进制转换成N进制。#include #include using namespace std; char index[62] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',原创 2014-02-13 21:41:48 · 2986 阅读 · 0 评论 -
linux socket read函数
int my_read(int fd, void *buffer, int length) { int bytes_left; int bytes_read; char *ptr = NULL; bytes_left = length; while转载 2014-04-21 14:35:13 · 6666 阅读 · 0 评论 -
map对key排序
struct CmpByKeyLength { bool operator()(const string& k1, const string& k2) { return k1.length() < k2.length(); }};转载 2014-04-28 22:56:10 · 620 阅读 · 0 评论 -
Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂转载 2014-05-23 10:27:23 · 718 阅读 · 0 评论 -
Python使用struct文章汇集
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize()pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串(实际上是类转载 2015-04-20 19:37:41 · 827 阅读 · 0 评论 -
snprintf函数介绍
#include#includeint main(){ char buf[10]; buf[0]=0; int len = snprintf( buf, sizeof(buf), "%s", "abcdefgaaab"); cout << buf << endl; cout << len << endl; return 0;}这原创 2012-03-02 20:32:43 · 974 阅读 · 0 评论 -
举例网络字节序和主机字节序
主机字节序若是int a = 0x12345678;则转换为网络字节序是:htonl(a)=0x78563412;原创 2012-02-20 19:36:22 · 587 阅读 · 0 评论 -
头文件定义变量的问题
这次又犯了头文件定义变量的错误问题,关键是linux环境下还不报错!例子如下:在common_config.h头文件中定义了如下变量:int CHANNEL_NUM = 1024;后在文件中的一个函数中修改此变量为120,但是退出此函数后,打印出变量的值,竟然依旧是1024。正确的做法是在common_config.h中声明这个变量:extern int CHANN原创 2012-02-01 17:33:44 · 673 阅读 · 0 评论 -
深度探索C++对象模型 Function语意学笔记
为什么C++可以进行函数重载呢?因为C++对函数进行编译的时候,对函数进行了重命名。即函数名称+参数数目+参数类型=新的函数名称。 对于虚拟成员函数,如果normalize()是一个虚拟成员函数,则以下的调用: ptr->normalize(); 将会被内部转化为: ( *ptr->vptr[1] )( ptr ); //第二个ptr表示this指针。 类似的,如果magnitude()也是一个虚拟函数的话,它将被转换如下: register float mag = m原创 2010-07-29 18:55:00 · 1047 阅读 · 0 评论 -
stdafx.h作用及原理
名称的英文全称为:Standard Application Framework Extensions 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程 编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。 预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是 projectname.pch。 编译器通过一个头文件st转载 2010-07-28 20:32:00 · 609 阅读 · 0 评论 -
宽字符与windows总结
与TCHAR.H一样,WINNT.H将TCHAR定义为一般的字符类型。如果定义了标识符UNICODE(没有底线),则TCHAR和指向TCHAR的指标就分别定义为WCHAR和指向WCHAR的指标;如果没有定义标识符UNICODE,则TCHAR和指向TCHAR的指标就分别定义为char和指向char的指标。 如果已经在某个表头文件或者其它表头文件中定义了TCHAR数据型态,那么WINNT.H和WCHAR.H表头文件都能防止其重复定义。不过,无论何时在程序中使用其它表头文件时,都应在所有其它表头文件之前包含转载 2010-07-28 20:34:00 · 820 阅读 · 0 评论 -
深度探索C++对象模型 Data语意学笔记
class X { };class Y : public virtual X { };class Z : public virtual X { };class A : public Y, public Z { };它们的sizeof结果如下:sizeof(X) = 1;sizeof(Y) = 8; //视编译器不同而不同sizeof(Z) = 8; //视编译器不同而不同sizeof(A) = 12;实际上,class X 并不是空,它有一个晦涩的1bytes,那是被编译器安插进去的一个char, 这使得这原创 2010-07-29 09:55:00 · 1182 阅读 · 2 评论 -
class和struct做类型定义时的区别
<br />从语法上,class和struct做类型定义时只有两点区别: <br />(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; <br />(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 <br />除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。 <br /><br />不能因为学过C就总觉得连C++中struct和class都转载 2010-08-17 16:46:00 · 603 阅读 · 0 评论 -
C++中的显式转换
<br /> 显式转换也成为强制转换(cast), 有如下几种类型:static_cast, dynamic_cast, const_cast, reinterpret_cast。<br /> 1. const_cast: 将转换掉表达式的const性质。<br /> const char *pc_str;<br /> char *pc = string_copy( const_cast<char*>(pc_str) );<br /><br /><br /> 2.原创 2010-08-17 11:00:00 · 716 阅读 · 0 评论 -
类型提升
<br />cout << (int)(unsigned short)(char)-1 << endl; 对于类型提升,在编码为补码的情形下,对有符号数,扩展存储位数的方法是对于新的高位字节,使用当前最高有效位(符号位)的值进行填充,即为符号扩展;而对于无符号数,则是对高位直接填零,即为零扩展。<br /> <br />(char)-1补码是1111 1111<br />(unsigned short)(char)-1 补码是1111 1111 1111 1111<br />(int)(unsigned s原创 2010-10-12 23:11:00 · 754 阅读 · 0 评论 -
类内静态函数和全局静态函数的相同点和不同点?
在函数或者变量前面加上static修饰符号,以便把函数或者变量在类内或者文件范围内共享,那么我们把这种函数和变量叫静态函数和静态变量。我们把函数和变量声明为静态的有什么优点那,从静态变量的角度看,更容易理解一些 使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静转载 2011-06-04 10:54:00 · 4585 阅读 · 1 评论 -
C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些转载 2011-07-03 10:25:07 · 432 阅读 · 0 评论 -
C++ map的基本操作和使用
1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。根据转载 2011-07-12 11:17:06 · 763 阅读 · 0 评论 -
程序如何在32位机子上支持大文件读写
今天在编写程序的时候,发现程序无法打开>4G的文件,获取文件的结构信息也获取不到,遂有这篇文章进行分享。有如下几个步骤需要添加:一:在所需要的头文件的#include之前添加如下几行代码:#undef _FILE_OFFSET_BITS#define _FILE_OFFSET_B原创 2011-07-11 21:14:03 · 1381 阅读 · 0 评论 -
关于迭代器失效
•迭代器失效:注意关联容器和序列容器的区别–序列容器 vector list deque–关联容器 Map set•序列性容器–erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是era转载 2011-07-17 20:20:22 · 520 阅读 · 0 评论 -
时间格式
与日期和时间相关的数据结构#ifndef _TM_DEFINEDstruct tm { int tm_sec; int tm_min; int转载 2011-07-13 11:02:37 · 517 阅读 · 0 评论 -
atoi对于传递错误参数返回值的总结
int key = atoi("abc")cout result: 0int key = atoi("")cout result:0int key = atoi("abc123")cout result: 0int key = atoi("1原创 2011-10-15 11:54:39 · 18868 阅读 · 3 评论 -
gdb 多线程调试
http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html http://blogold.chinaunix.net/u3/94700/showart_2389432.html转载 2012-01-31 23:12:34 · 466 阅读 · 0 评论 -
Linux time()函数
函数简介 函数名: time 头文件:time.h 函数原型:time_t time(time_t * timer) 功能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒转载 2015-05-07 11:39:34 · 799 阅读 · 0 评论