随笔分类 -  编程方法

摘要:1. 在Linux下,如何确认是多核或多CPU: #cat /proc/cpuinfo 如果有多个类似以下的项目,则为多核或多CPU: processor : 0 ...... processor : 1 2. Linux下,如何看每个CPU的使用率: #top -d 1 之后按下1. 则显示多个CPU Cpu0 : 1.0%us, 3.0%sy, 0.0%ni, 9... 阅读全文
posted @ 2012-02-16 21:38 dzqabc 阅读(9949) 评论(0) 推荐(0)
摘要:CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.一个CPU的亲合力掩码用一个cpu_set_t结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作: ·CPU_ZERO() 清空一个集合 ·CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉. ·CPU_ISSET()检查一个CPU号是否在这个集合中.下面两个函数就是用来设置获取线程CPU 阅读全文
posted @ 2012-02-15 21:39 dzqabc 阅读(11976) 评论(2) 推荐(1)
摘要:假设业务模型中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程基于1中的 负载均衡是针对进程数,那么(1)(2)大部分时间会出现在cpu0上,(3)的n个进程会随着调度,平均到其他多个cpu上,(4)里的进程也是随着调度分配到各个cpu上;当发生网卡中断的时候,cpu被打断了,处理网卡中断,那么分配到cpu0上的worker进程肯定是运行不了的其他cpu上不是太耗费cpu的进程获得cpu时,就算它的时间片很短,它也是要执行的,那么这个时候,你的worker进程还是被影响到了;按照调度逻辑,一种非常恶劣的情况是 阅读全文
posted @ 2012-02-15 21:17 dzqabc 阅读(12130) 评论(2) 推荐(1)
摘要:数组定义时长度可以使用变量不是很清楚了,自己写的是可以的,可能新版本编译器已经支持函数调用时动态分配数组空间了吧,使用g++是编译成功了。 动态长度的栈区数组是C99的特性。在C99之前,在栈区分配动态大小的内存块是使用alloca函数,不过由于不在堆中,分配出来的内存不需要释放滴int len;c 阅读全文
posted @ 2012-02-12 22:27 dzqabc 阅读(4041) 评论(0) 推荐(0)
摘要:概述 C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。 下面结合问题分别进行阐述。 阅读全文
posted @ 2012-02-04 23:20 dzqabc 阅读(1488) 评论(0) 推荐(0)
摘要:在C++中经常会涉及到处于不同头文件的类互相引用的情况,有时候头文件引用(include)会搞得很乱,导致报一堆的错。其实遵循一定规则,可以避免大部分的混乱。 首先,要对头文件进行处理,保证不会出现重定义的错误。这个应该每个人都会,通常有两种做法: 1. 在.cpp文件中添加保护,比如在.cpp文件中添加: #ifndef _XX_H_ #define _XX_H_ ... 阅读全文
posted @ 2011-12-15 22:46 dzqabc 阅读(449) 评论(0) 推荐(0)
摘要:多态是面向对象的基本特征之一。而虚函数是实现多态的方法。那么virtual function到底如何实现多态的呢?1 基类的内存分布情况请看下面的sampleclass A{void g(){.....}};则sizeof(A)=1;如果改为如下:class A{public: virtual void f() { ...... } void g(){.....}}则sizeof(A)=4! 这... 阅读全文
posted @ 2011-10-25 00:16 dzqabc 阅读(5698) 评论(0) 推荐(1)
摘要:1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d\n", si... 阅读全文
posted @ 2011-09-24 08:01 dzqabc 阅读(204) 评论(0) 推荐(0)
摘要:C++的运算符优先级表 Precedence Operator Description Example Associativity 1 ()[]->.::++-- Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-increme... 阅读全文
posted @ 2011-09-24 07:58 dzqabc 阅读(245) 评论(0) 推荐(0)
摘要:1、如果用容器存副本,则容器销毁的时候,副本也会自动被删除。如果用容器存指针,则容器销毁的时候,不会删除这些指针所指向的对象,因此必须先手工删除完毕之后,再销毁容器。2、如果用容器存副本,其存入、取出的过程是通过拷贝构造函数和赋值操作符来进行的。如果你没有显式地提供这两者,则使用缺省的拷贝构造函数和赋值操作符,其实现方式为:内存复制。例如:假若你没有提供CFileAttribute::operat... 阅读全文
posted @ 2011-07-13 00:56 dzqabc 阅读(592) 评论(0) 推荐(0)
摘要:其实只要让编译器确认了你所要取的值是什么,它自然会帮你取得。只是在我们取得函数指针时是不可以指明参数的,这样子我们该如何告诉编译器我们需要神马呢? 在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址; 我们用常规方法获取的地址只是第一种重载的地址. 下面是引用一段del... 阅读全文
posted @ 2011-07-13 00:38 dzqabc 阅读(1582) 评论(0) 推荐(0)
摘要:1. 指针的来源 在当代,大多数的现代计算机都会把内存分割成字节,每个字节都有着其唯一的地址。可执行程序由代码和数据两部分构成,而程序中的每个变量都占有着一个或多个字节,也就是说,每个变量都有着自己的地址。而这个就是指针的来源。 其实每个地址就是一个数,但是我们却不能用数来表示地址,存储地址,我们需要用指针变量。例如int *p = i,我们就可以说p是指针变量,存储着变量i的地址。 那么我们说... 阅读全文
posted @ 2011-06-17 00:47 dzqabc 阅读(227) 评论(0) 推荐(0)
摘要:1. 数组大小 我相信,在C#/Java中,更多的人愿意用List<T>来取代数组,一方面是List提供了较多的方法,另一方面也无需我们去指定数组的大小。 那么在C语言中,我们既然需要必须指定数组的大小,而一般来讲,很多数组大小事我们无法确定并且经常会发生变化的,那么我们最好的方式就是用宏定义来限定数组的大小。#define SIZE 10int main (void){ int a[SIZE]... 阅读全文
posted @ 2011-06-17 00:39 dzqabc 阅读(294) 评论(0) 推荐(0)
摘要:1. typedef 在前文中,我们用宏定义来定义了一个BOOL类型,那么现在就用更专业的方式来定义类型。typedef int Bool;int main (void){ Bool flag=1; if(flag) { printf("True"); } else { printf("false"); }}typedef 的作用就是类型定义(Type Definition)。类型定义有以下三个... 阅读全文
posted @ 2011-06-17 00:38 dzqabc 阅读(212) 评论(0) 推荐(0)
摘要:1. 编译和链接 将程序转化为机器可执行的代码,C语言分为三个步骤: A. 预编译。程序首先会交给预处理器,预处理器执行以#开头的指令,然后给程序添加指令,或者修改指令。 B. 编译。修改后的程序进入编译器,编译器会把程序翻译成机器指令(也就是目标代码),但是这样的程序还是不能执行的。 C. 链接。链接器把由编译器产生的目标代码和其他所需的代码整合到一起,这些附加代码包括程序中用到的库函数。这样... 阅读全文
posted @ 2011-06-17 00:24 dzqabc 阅读(267) 评论(0) 推荐(0)
摘要:引用是可以作为类的成员变量的。 引用类型成员变量的初始化: 1,不能直接在构造函数里初始化,必须用到初始化列表,且形参也必须是引用类型。 2,凡是有引用类型的成员变量的类,不能有缺省构造函数。原因是引用类型的成员变量必须在类构造时进行初始化。3,如果两个类要对第三个类的数据进行共享处理,可以考虑把第三个类作为这两个类的引用类型的成员变量。 阅读全文
posted @ 2011-04-01 00:08 dzqabc 阅读(1308) 评论(0) 推荐(0)
摘要:STL map和set的使用虽不复杂,但也有一些不易理解的地方,如: 为何map和set的插入删除效率比用其他序列容器高? 为何每次insert之后,以前保存的iterator不会失效? 为何map和set不能像vector一样有个reserve函数来预分配数据? 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和 阅读全文
posted @ 2011-01-05 00:02 dzqabc 阅读(2832) 评论(0) 推荐(0)
摘要:WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给 WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。 局部钩子仅钩挂您自己进程的事件。远程钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种: 基于线程的 它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。 系统范围的 将捕捉系统中所有进程将发生的事件消息。 阅读全文
posted @ 2010-11-28 11:07 dzqabc 阅读(403) 评论(0) 推荐(0)
摘要:堆与栈比较1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。2.空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。注意:reserve最小值为4Byte;c 阅读全文
posted @ 2010-09-08 23:26 dzqabc 阅读(219) 评论(0) 推荐(0)
摘要:在VC2008中编程如下: TempValue.Format("%d",m_CH1_Value); //TempValue为Cstring类型,m_CH1_Value为Int类型编译之后出现1>e:\project\cplus\control\control\controldlg.cpp(200) :error C2664: “void ATL::CStringT<BaseType,StringTraits>::Format(constwchar_t *,...)”: 不能将参数1 从“const char [3]”转换为“const wchar_t *” 阅读全文
posted @ 2010-08-12 23:35 dzqabc 阅读(1601) 评论(0) 推荐(0)