文章分类 - C/C++
1
标准C、C++语言
用SSE做向量内积
摘要:SSE是Streaming SIMD Extensions的缩写,SIMD是Single Instruction Multiple Data的缩写,即对多条数据并行执行相同的操作,以提高CPU的性能。 从SSE4.1开始支持向量的内积:__m128 _mm_dp_ps( __m128 a,__m12
阅读全文
__stdcall和__cdecl的区别
摘要:__stdcall和__cdecl是两种函数名字修饰。(注意是连续的两个下划线)Windows上windows上不管是C还是C++,默认使用的都是__stdcall方式。不论__stdcall还是__cdecl函数参数都是从可向左入栈的,并且由调用者完成入栈操作。对于__stdcall方式被调用者自身在函数返回前清空堆栈;而__cdecl则由调用者维护内存堆栈,所以调用者函数生成的汇编代码比前一种方式长。由__cdecl约定的函数只能被C/C++调用。Windows上使用dumpbin工具查看函数名字修饰。C语言__stdcall方式:_FuncName@sizeofParameters例如:
阅读全文
C++继承
摘要:先上一段代码:#include<iostream>using namespace std;class Base{public: int a;protected: int b;private: int c;};struct Derived:public Base{};int main(){ Derived inst; cout<<sizeof(Base)<<endl; cout<<sizeof(Derived)<<endl; cout<<sizeof(inst)<<endl; cout<<inst.a
阅读全文
栈溢出
摘要:栈是从高地址向低地址方向增涨,堆的方向相反。在一次函数调用中,栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在栈中开辟相应的空间以构造变量。在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压b,最后a。在取参数的时候,由于栈的先入后 出,先取栈顶的a,再取b,最后取c。C语言是不作栈溢出检查,如下代码可以正常编译运行。#include<stdio.h>main(){ char buf[2]; printf("enter a string shorter than 2.\n"); sca
阅读全文
union变量存储
摘要:字节序小端字节序(Little Edian)指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。比如整形1在内存中的存放情况是:而换成大端字节序(Big Edian)则是:基于Intel X86的体系结构的PC机是小端字节序,我们可以写一个程序来验证。#include<stdio.h>main(){ int num=1; int c=num>>24; printf("%d\n",c); c=num & 0xff; printf("%d\n",c);}输出0和1。我们知道union中只存储一个成员变量,union的
阅读全文
struct变量存储
摘要:在没有#pragma pack宏的情况下,结构体中的变量存储遵循以下对齐原则:原则一:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从其自身大小的整数倍开始。原则二:结构体的总大小,也就是sizeof的结果,必须是其内部最大数据成员的整数倍,不足的要补齐。原则三:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大数据成员大小的整数倍地址开始存储。上面提到的“数据成员”均指基本数据类型。#include<stdio.h>struct A{ char c; int i; short s; };struct B{ int i; char c; shor
阅读全文
变量的自动初始化
摘要:对于内置变量的自动初始化代码1 1 #include<stdio.h> 2 #define CONST 100 3 int *p1; 4 int a[2]; 5 int b; 6 static int c; 7 main() 8 { 9 int d;10 static int e;11 int f[2];12 int *p2;13 printf("CONST=%d\n",CONST);14 printf("a[0]=%d\n",a[0]);15 //printf("*p1=%d\n",*p1);16 printf(&quo
阅读全文
学习优秀源码
摘要:根据文件名的后缀,判断是不是图片char *Pic_list[]={"jpg","bmp","png",NULL};int isPic(char *name){ char **listwalk; int len; for (listwalk = Pic_list; *listwalk; listwalk++) { len = strlen(*listwalk); if (strlen(name) > len && !strcasecmp(name + strlen(name) - len, *listwalk))
阅读全文
"abcde"是字符串常量
摘要:main(){ char *p1="abcde"; //p1是main函数中的局部变量,存放在栈区;"abcde"是字符串常量,存放在数据区 char *p2=(char*)malloc(10); //p2存放在栈区;malloc来的10个字节位于堆区 char *p3=dup(p1); //dup背后调用了malloc p1[0]='w'; //错误,字符串常量不可修改 char *p4=index(p1,'d'); //p4指向了数据区中的"abcde"中的'd' p4='w
阅读全文
C语言内存泄漏之free、valgrind、examine
摘要:先来介绍valgrind和examine这两个工具的使用。使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:x/<n/f/u> <addr>n、f、u是可选的参数。n 是一个正整数,表示显示内存的长度。f 表示显示的格式,其取值如下:x 按十六进制格式显示变量d 十进制u 十六进制无符号整型o 八进制t 二进制c 字符s 字符串f 浮点数i 指令u 表示从当前地址往后请求的字节数,其取值如下:b表示单字节h表示双字节w表示四字 节(默认)g表示八字节Valgrind 可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,
阅读全文
Linux上安装使用boost入门指导
摘要:
获得boost
boost分布
只需要头文件的库
使用boost建立一个简单的程序
准备使用boost二进制文件库
把你的程序链接到boost库
阅读全文

函数指针和指针函数
摘要:先说指针函数,这个简单,就是一个函数的返回类型是个指针嘛,如 int* f(x,y);指向函数代码首地址的指针变量称为函数指针。bool LC (string &, string &); //声明一个普通函数bool (*pf) (string &, string &); //声明一个函数指针下面的代码是合法的:bool b=LC(str1,str2);bool b=(*pf)(str1,str2);typedef bool (*cmpFunc) (string &, string &); //定义一种类型的名称,这种类型就是函数指针下面的代码是
阅读全文
C语言里的字符串
摘要:C语言里的字符串一定纠结了大家太多的感情。1.char *char *buff="orisun";sizeof(buff)=4 用32位存放一个指针strlen(buff)=6 strlen返回字符串的实际长度,不包括末尾的'\0'2.char [n]char bu[100]="orisun"; 从第7位到第100位都是'\0'sizeof(bu)=100 bu是一个数组,sizeof返回数组的长度strlen(bu)=6 strlen返回字符串的实际长度,不包括末尾的'\0'但注意在printf(&quo
阅读全文
分配内存,并全部设置为0
摘要:1.void *calloc(size_t nmemb,size_t size);#include<stdlib.h>struct test{int a[10];char b[20];}main(){struct test *ptr=calloc(sizeof(struct test),10);}2.#include<string.h>void bzero(void *s,int n);bzero()会将参数s所指的内存区域前n个字节,全部设为零值。3.void * memset (void *s ,int c, size_t n);#include <strin
阅读全文
Core Dump和/proc调试
摘要:Core Dump通过Core Dump是事后调试(postmortem debug)。首先把Core文件的大小设置为1024orisun@zcypc:~$ ulimit -c0orisun@zcypc:~$ ulimit -c 1024注意此修改仅在当前shell有效root@zcypc:/home/orisun# echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern所有的core文件将会存放到/corefile中,文件名格式为:core-命令名-pid-时间戳我们写一个脚本来模拟Core Du
阅读全文
调试技术
摘要:GDB(gdb) r 65536 hello 带参数运行可以用ps | grep ×××或pstree来查看进程IDattach <PID> 挂接已经运行的程序,即调试正在运行的程序detach <PID> 取消挂载watch <expression> 一旦表达式值有变化时,马上停止程序gdb调试过程中查看源代码list list <line-number>list <function>单步调试可以用n(ext)和s(tep),step进入函数内部,next不进入在指定函数处设置断点b sumset ar
阅读全文
std::string的共享内存和Copy-On-Write技术
摘要:简单来说,在复制一个对象时并不是真的在内存中把原来对象的数据复制一份到另外一个地址,而是在新对象的内存映射表中指向同原对象相同的位置,并且把那块内存的 Copy-On-Write 位设为 1。在对这个对象执行读操作的时候,内存数据没有变动,直接执行就可以。在写的时候,才真正将原始对象复制一份到新的地址,修改新对象的内存映射表到这个新的位置,然后往这里写。这个技术需要跟虚拟内存和分页同时使用,其好处是在复制对象的时候因为并不是真的复制,而只是建了一个“指针”,因而大大提高性能。但这并不是一直成立的,前提是在复制新对象之后,进行的写操作只是在一小部分的内存分页上,大部分分页不会用到或者只是读取。不
阅读全文
动态创建和释放二维数组
摘要:C动态创建和释放二维数组#include<stdio.h>#include<stdlib.h>#define ROW 5#define COL 4main(){ int i; int **arr; arr=(int **)malloc(ROW*sizeof(int*)); for(i=0;i<ROW;++i) arr[i]=(int*)malloc(COL*sizeof(int)); printf("%d\n",arr[ROW-1][COL-1]); for(i=0;i<ROW;++i) free(arr[i]); free(arr);}
阅读全文
全局变量用常量初始化----C和C++的不同
摘要:有两个程序:int i=10;int j=i+4;main(){}/***********************/int i=10;main(){static int j=i;}/************************/如果把文件命名为.c,用gcc去编译会出现“initializer element is not constant”错误。如果把文件命名为.cc,用g++去编译正确通过!我们知道静态变量(全局和局部的)、常量、全局变量存储在数据段(参见我的另一篇博客《Linux内存管理》),一个可执行文件(只是一个静态文件,还没有运行)有代码段、数据段和示未初始化数据段。计算机只会
阅读全文
const学习大总结
摘要:const学习大总结1.constinti=8;常量在定义后不能更改,所以定义时必须初始化2.const对象默认为头文件的局部变量非const变量默认为extern。要使const变量能够在其他文件中访问,必须显式地指定它为extern。//file_1.ccintcounter;//file_2.ccexternintcounter;++counter;--------------------------------//file_1.ccexternconstintbufSize=fcn();//file_2.ccexternconstintbufSize;if(i<bufSize)插
阅读全文
1