C/C++
zhuliting
喜欢简单,安静……
展开
-
libxml库教程
分享两个关于xml的不错的链接1. libxml库教程,并且附有源代码,易懂http://www.xmlsoft.org/tutorial/2. XML 教程http://www.zvon.org/xxl/XMLTutorial/General_chi/book.html原创 2013-12-04 17:19:37 · 1992 阅读 · 0 评论 -
浅复制与深复制
浅复制指的是完全按照内存中的数据内容进行的复制行为,即无论原数据类型是什么,都忠实地将其复制到目标内存区域中。C++编译器默认的复制构造函数以及赋值函数执行的都是浅复制。如:class A{public: A(int i):m(i){}private: int原创 2011-09-16 14:34:40 · 749 阅读 · 0 评论 -
虚函数表和虚函数表的指针
有虚函数的类都有一个虚函数表,它是实现多态的关键。 虚函数表可以继承,如果子类没有重写虚函数,那么子类虚函数表中仍然会有该函数的地址,只不过这个地址指向的是基类的函数实现。如果子类重写了相应的虚函数,那么虚函数表中的地址就会改变,指向自身的函数实现。如果派生类中有自己的原创 2011-10-01 11:28:23 · 1177 阅读 · 0 评论 -
如何确定程序中栈的增长方向
函数调用时参数入栈,因此可以定义两个函数,分别输出参数地址,以此来确定栈的生长方向。//确定栈的生长方向//自定义函数fun1() 和fun2(),其中fun1()内部调用fun2(),输出参数地址#includevoid fun2(int b) { printf原创 2011-09-30 13:17:43 · 3617 阅读 · 0 评论 -
希尔排序
希尔排序有时也叫做缩减增量排序,将欲排序的数值依某个间隔长度分成数个数列集合,再针对各个数列集合进行插入排序,重复进行数列分割,每一次取的间隔长度要缩减,直至分割间隔为零,本程序中将间隔长度缩减为上次的一半。#include #include #include #def原创 2011-10-02 17:28:10 · 664 阅读 · 0 评论 -
将一个字符串按单词逆序
给定一个字符串,按单词将该字符串逆序,如输入"hello world",输出为"world hello"。方法:先按单词逆序,再对整个句子逆序。//给定一个字符串,按单词将该字符串逆序,不包括标点#include//p和q之间的逆序void ReverseW原创 2011-09-29 12:36:49 · 6852 阅读 · 0 评论 -
不用第三方参数,交换两个参数的值
#include using namespace std;void Swap1(int &a, int &b) { a = a + b - (b = a); }int main(){ int a = 4, b = 5; cout << "before swap: "原创 2011-09-19 09:35:15 · 1923 阅读 · 0 评论 -
快速排序和堆排序
快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个枢轴元素,通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于或者等于枢轴,另外一部分的所有数据都要大于或者等于枢轴,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此原创 2011-09-28 22:51:36 · 1309 阅读 · 0 评论 -
限制一个类对象只在堆上分配或者只在栈上分配
1、将类的构造函数属性置为private,同时提供static成员函数create,在函数中new一个新对象,这样实现的类可以只可以在堆上分配。class Base { protected: static Base* single; Base(){原创 2011-10-11 13:03:40 · 1102 阅读 · 0 评论 -
main函数执行完毕,能否再执行一段代码
可以用_onexit注册一个函数,它会在主函数之后执行(好像只能在windows上面运行)。#include #include /* Prototypes */int fn1(void), fn2(void), fn3(void), fn4 (void);in原创 2011-09-18 16:19:54 · 762 阅读 · 0 评论 -
++a += a++
#include int main( void ){ int a = 4; //a += a++; //a += (++a); ++a += a++; printf( "%d\n",a); return 0;}这个应该有固定的结果. 汇编代码如下:原创 2011-09-18 18:06:20 · 747 阅读 · 0 评论 -
C++中的临时对象
临时对象由编译器在编译过程中“悄悄”创建(往往是为了某些特殊操作),并在适当时候销毁;它并不出现在源代码中,开发人员并没有声明要使用它,没有为其声明变量。临时对象的产生,程序的性能会下降,因为对象的创建和销毁对程序的性能影响很大。临时对象一般产生于两种场合:1、实际调用函数时原创 2011-10-01 13:19:56 · 691 阅读 · 0 评论 -
位域的几点说明
位域,就是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。1、很多书上都说,位域存储在同一个字节中,不能跨两个字节存储。个人发现这个规则有问题,下面的例子在vs 2005下能正确编译和运行,至少说明了位域可以跨字节:#include using n原创 2011-10-01 10:49:54 · 982 阅读 · 0 评论 -
矩阵乘的MPI并行程序
计算A * B = C, 其中矩阵A, B均为方阵,采用主从式程序设计模式,用户从键盘输入矩阵规模N,然后随机数给矩阵赋值。我的并行化方法很简单,将矩阵A按行划分,由主进程将矩阵A散发给各个子进程,各子进程把计算结果发送给主进程汇总。其中的矩阵都是用一维数组来模拟的,代码附上,欢迎拍砖~毕业了,才发现很喜欢并行计算啊~ #include "mpi.h"#include原创 2012-04-20 22:03:31 · 5475 阅读 · 6 评论 -
core dump和段错误
在代码量较多时,调试比较困难。常用方法是在源码中插入大量的printf语句。但是当发生segmentation fault时,定位就比较复杂了。 core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump, 它可以做为调试程序的参考. 有时候程序down了, 但是core文件却没原创 2013-03-07 22:18:18 · 2802 阅读 · 0 评论 -
从 stdin 读取输入的C程序示例 && python脚本调用可执行文件
#include #include #include #define MAX_BUFFER_LENGTH 1024*10int main(int argc, char *argv[]){ char buf[ MAX_BUFFER_LENGTH ]; int length = 0; if( (length = read( 0, buf, MAX_BUFFER_原创 2012-07-07 00:19:10 · 3936 阅读 · 0 评论 -
nxn棋盘的m皇后问题代码
http://blog.csdn.net/zhuliting/article/details/6302767去年4月份修改的代码,现在贴出来分享一下。毕业了,工作上可能会很忙,不能更新博客了。 #include "mpi.h"#include #include #include #include #include using namespace std;en原创 2012-04-08 17:43:01 · 2774 阅读 · 1 评论 -
面试题总结
个人遇到的笔试面试题目,不当之处,欢迎批评指正!(本博客左侧的连接收藏里有在线编译器)1、strcpy()的写法. 题目:已知strcpy函数的原型是char * strcpy(char * Dest, const char * Src); 1、不调用库函数,实现strcpy函数。 2、解释为什么要返回char *。//返回指针是为了方便链原创 2011-11-05 09:27:04 · 2623 阅读 · 3 评论 -
关于虚函数的两道读程序题
读程序,写出输出的结果:关于虚函数和多态,可参考一篇不错的文章http://blog.csdn.net/moxiaomomo/article/details/68264121、virtual意味着运行时再决定调用哪个函数。#includeusing namespace std; class Base{public: Base(){} v原创 2011-10-12 11:00:45 · 962 阅读 · 1 评论 -
C语言活动记录
活动记录,就是在程序执行的过程中函数调用时栈上的内容变化。一个函数被调用,反映在栈上的与之相关的内容被称为一帧,其中包含了参数、返回地址、老ebp值、局部变量以及esp和ebp。 C语言默认的调用规约为cdecl,参数从右往左依次入栈,之后是函数的返回地址入栈,接着是老ebp入栈。 ESP是栈顶指针,EBP就基指针寄存器,用它可以存取栈中的数据,向上(栈底方向)可以获取返回地址原创 2011-10-01 16:15:05 · 4713 阅读 · 2 评论 -
指针数组和数组指针
1、数组指针,也称指向一维数组的指针,即行指针,指针所指的对象是一个数组.通常定义为int (*p)[n],()的优先级高,说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n.也就是说执行p+1时,p要跨过n个整型数据的长度.如:int a[3][4];int (*p)[4]; //定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二维数组的原创 2011-10-01 23:21:16 · 789 阅读 · 0 评论 -
C++中禁止产生非堆对象
C++中将析构函数声明为peotected 或者 private权限,可以禁止产生非堆对象。如果在栈中定义对象,则它是不能自动销毁的。class Demo{public:...protected: ~Demo():} 如上定义后,可以可以Demo原创 2011-10-09 09:18:42 · 874 阅读 · 0 评论 -
strtok函数
#include #include int main(){ char str[] = "root:x::0:root:/root:/bin/bash:"; char *token; token = strtok(str, ":"); printf("%s\n",原创 2011-09-03 16:19:34 · 745 阅读 · 0 评论 -
加法运算和乘法运算的耗时问题
#include #include using namespace std;const int ITER = 200000000;int main() { float a, b, s; timeval start, end; double span; a = 1000.011 / 3; b = 2.011 / 3; //cout原创 2011-01-05 22:35:00 · 4997 阅读 · 2 评论 -
Introduction to SSE Programming /基于SSE指令集的程序设计简介
IntroductionThe Intel Streaming SIMD Extensions technology enhance the performance of floating-point operations. Visual Studio .NET 2003 supports a set of SSE Intrinsics which allow the use of SSE instructions directly from C++ code, without writing the原创 2010-11-13 19:11:00 · 2229 阅读 · 0 评论 -
内存对齐的一篇不错的文章
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bigwhite.blogbus.com/logs/1347304.html在最近的项目中,我们涉及到了“内存对齐”技术。对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。一、内存对齐的原因大部分的参原创 2010-12-17 10:19:00 · 792 阅读 · 0 评论 -
循环开销(loop overhead)测试程序
同样的运算次数,for 循环的个数不同,开销也是不同的。我表示很无知……#include #include #include using namespace std;int main() { int k; struct timeval start, end; gettimeofday(&start, NULL); for (int l = 0; l原创 2010-12-12 11:59:00 · 2129 阅读 · 0 评论 -
new和delete示例程序
//实现一个任意行、不等列的二维表/*示例输入:43 11 12 132 21 224 31 32 33 341 41输出:411 12 13 average:1221 22 average:21.531 32 33 34 average:32.541 average:41*/#include using namespace std;typedef struct { int num; int *rowPointer;}Row;voi原创 2010-12-06 16:55:00 · 591 阅读 · 0 评论 -
malloc/new
malloc:原型:extern void *malloc(unsigned int num_bytes); 头文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 与 malloc.h 的内容是完全一致的),而在Visual C++6.0中可以用malloc.h或者stdlib.h。 功能:分配长度为num_bytes字节的内存块 返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。 说明原创 2010-10-08 09:20:00 · 1258 阅读 · 0 评论 -
linux进程与它的堆栈空间
<br /> <br />一)概述.堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储.<br />.堆栈中存放的是函数中的局部变量,在函数的生命周期中可以将变量压入堆栈,编译器需要确保堆栈指针在函数退出前恢复到初始位置,也就是说,内存是自动分配和释放的.<br />.C/C++把存储在堆栈中的局部变量当作automatic存储,并使用auto关键字,这是局部变量的默认存储方式,所以现在没有人用auto关键词.<br />.与动态存储相对映的静态存储,也就是用static定义的局部变量,它不用堆栈来存储原创 2010-08-30 09:33:00 · 1477 阅读 · 0 评论 -
Linux下时间度量的深入分析
一)ANSI clock函数1)概述:clock 函数的返回值类型是clock_t,它除以CLOCKS_PER_SEC来得出时间,一般用两次clock函数来计算进程自身运行的时间.ANSI clock有三个问题:1)如果超过一个小时,将要导致溢出.2)函数clock没有考虑CPU被子进程使用的情况.3)也不能区分用户空间和内核空间.所以clock函数在linux系统上变得没有意义.2)测试编写test1.c程序,测试采用clock函数的输出与time程序的区别.vi test1.c #include #in原创 2010-08-21 11:00:00 · 1483 阅读 · 0 评论 -
Win32 Application & Win32 Console Application
控制台程序是为了兼容DOS程序而设立的,这种程序的执行就好像在一个DOC窗口中执行一样,没有自己的界面。INTEL的CPU有三种工作模式,实模式,保护模式,虚拟模式。实模式是16位的,在这种模式下可工作纯DOC。保护模式是32位的,WINDOWS就工作在这种模式下,为了使在32位保护模式下工作的WINDOWS可兼容16实模式下的DOC程序,又设立了虚拟模式,就是控制台程序。控制台程序运行单个程序方原创 2010-05-10 11:46:00 · 880 阅读 · 0 评论 -
oprn/read/write/close系统函数
open系列是 POSIX 定义的,是UNIX系统里的system call,只能用在 POSIX 的操作系统上。使用open系列函数需要"#include ".基于文件描述符的输入输出函数: open:打开一个文件,并指定访问该文件的方式,调用成功后返回一个文件描述符。 creat:打开一个文件,如果该文件不存在,则创建它,调用成功后返回一个文件描述符。 close:关闭原创 2010-05-09 12:43:00 · 2781 阅读 · 0 评论 -
SpMV的CSR程序
#include #include //#includeusing namespace std;const int MAXM = 1500000;const int MAXN = 1500000;const int matSize = 30000000;int row, col, nnz;const int TestTime = 100;int row_start[MAXM];long col_idx[matSize];float value[matSize]原创 2011-01-06 16:38:00 · 2603 阅读 · 0 评论 -
Hash表的一个小程序
http://192.168.100.16/showproblem.php?pid=1425原来这就是Hash啊,仰慕#include #include int a[1000001];int main() { int n, m; int data; int count; int flag = 0; //freopen("input.txt", "r", stdin); while (scanf("%d%d", &n, &m) != EO原创 2011-01-09 11:34:00 · 1120 阅读 · 0 评论 -
函数指针的定义与操作示例
//任意输入两个操作数和一个加、减运算符,完成对应的加减运算,并给出结果//示例:输入3+5,输出3+5=8#include using namespace std;float add(float x, float y) { cout > a >> c >> b; switch (c) { case '+': p = add; break; case '-': p = sub; break; default: cout > c; if (c !=原创 2010-11-16 23:06:00 · 946 阅读 · 0 评论 -
MPI + C 的hello world程序
为什么我博客的头像变成了一个小盆友啊?原创 2010-12-14 18:50:00 · 4549 阅读 · 0 评论 -
MPI_Bcast广播操作的通信开销测试
#include "mpi.h"#include #include #include #include int main(int argc, char **argv){ int i, myid, other, numprocs; double start, end; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_原创 2011-06-10 22:18:00 · 3153 阅读 · 0 评论 -
intel 编译器的矢量化测试
/**Name : vectorized.c*Purpose: test the performance of intel compiler*Author: Albert*/#include #include #include const i原创 2011-07-14 15:57:34 · 1454 阅读 · 0 评论 -
深腾7000上用bsub命令提交MPI作业
小规模作业运行在厚节点队列上,配置:这三个队列节点都一样,16路4核 共64核 Xeon X7350 2.93GHz, 512G内存x64_small 共2个节点 1-8核 6小时x64_3950 共5个节点 1-64核 6小时x64_3950_long 共11个节点 1-64核 144小时 x64_small就是用来给小作业运行的。如果需要运行稍大作业的话,不妨用x64_3950或x64_395原创 2011-06-27 17:35:00 · 8117 阅读 · 4 评论