C++ language
wangeen
商业化产品可能是有用的但最好的东西往往是免费的空气水Vim
展开
-
C 调用 fortran 可能遇到的问题
1. fortran 的函数名字是不区分大小写的,调用的时候一律用小写, 例如 abc_2. fortran全部用指针,int之类的都要写成 int*, 特别注意的是数组,例如 int* a, 用这fortran中不需要写成int**3. 不要忘记编译的时候加上-lgfortran4. 二维指针在fortran中是连续存储的,所以调用的时候完全可以用一维数据代替原创 2012-06-13 09:25:33 · 1889 阅读 · 2 评论 -
jump table
有效消除分支预测#include #include typedef void (*Handler)(void); /* A pointer to a handler function */ /* The functions */void func3 (void) { printf( "3\n" ); }void func2 (void) { printf( "2\n" )转载 2013-07-02 11:28:39 · 1703 阅读 · 0 评论 -
Bit Twiddling Hacks
一篇很好的bit操作相关优化的文章。Bit Twiddling HacksBy Sean Eron Andersonseander@cs.stanford.eduIndividually, the code snippets here are in the public domain (unless otherwise noted) — feel free to use the转载 2013-07-02 11:20:21 · 1098 阅读 · 0 评论 -
浮点数的表示和精度
如果a>0,那么1+a一定大于1吗?在数学上,答案是肯定的。但在计算机上,答案就与a的大小和浮点数的精度有关了。在matalb上,可以作以下计算:>> a=1/2^52a = 2.220446049250313e-016>> 1+a>1ans = 1>> a=1/2^53a = 1.110223024625157e-016>> 1+a>1ans =转载 2013-08-30 11:16:57 · 1414 阅读 · 0 评论 -
STL中的bitset
STL中的bitset声明#include using std::bitset;bitset的定义和初始化bitset32> bitvec; //32位,全为0。给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。这条语句把bitvec定义为含有32个位的bitset对象。和vect转载 2013-09-17 17:06:48 · 730 阅读 · 0 评论 -
C++ benchmark – std::vector VS std::list VS std::deque
December 3, 2012 byBaptiste Wicht14 CommentsLast week, I wrote a benchmark comparing the performance of std::vector and std::list on different workloads. This previous article received a lot转载 2013-10-13 15:47:52 · 1648 阅读 · 0 评论 -
unsigned char 的使用
我们在new一个buffer的时候要尽量使用unsigned char而不是简单的char,因为由于位移运算符号的特殊性质,会根据首个bit的0或者1自动添加,如果是char就会产生很多错误,所以作为buffer我们要使用unsigned char。原创 2013-10-28 13:23:18 · 6772 阅读 · 0 评论 -
关于swicth和goto之后的大括号
http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statementswitch 和 goto之后的语法最好加上大括号,否则一些定义会出错。原创 2014-01-19 21:16:47 · 1304 阅读 · 0 评论 -
C++学习之Base64
一般是不会用string来存储内存的内容的,而是用unsigned char*来做这样的事情。但是如果图方便要用string来表达内存的内容就要用到base64,下面是我用到的一段代码,整理一下备忘。#include #include #include using namespace std; // base64 tablesstatic char ba原创 2014-03-06 16:54:59 · 1258 阅读 · 0 评论 -
C++学习之rapidXML
这篇简介写的不错看起来很舒服。http://semidtor.wordpress.com/2013/03/29/rapidxml-mini-tutorial/另外下面是官方的文档和下载链接http://rapidxml.sourceforge.net/下面是一个自己写的遍历的例子:#include "../xml/rapidxml.hpp"using namesp原创 2014-03-21 16:36:01 · 1291 阅读 · 0 评论 -
C学习之接口和实现
这篇文章是对C语言接口和实现这本书的理解。下面是一个参考链接,对原书有详细的引用.http://site.douban.com/107552/widget/notes/106347/note/167405435/C语言虽然不是很擅长面向对象的设计思维,但是同样讲究能有一种可重用的设计,这里也就是接口和实现。这本书几乎就是一个C语言版本的STL的实现,通过用C实现STL来讲解C语言的接口原创 2014-04-01 17:00:20 · 1725 阅读 · 0 评论 -
C++学习之set
子弟 3 #include 4 using std::set; 5 - 6 struct Center{| 7 Center(){}| 8 Center(long x, long y):x_(x), y_(y){}| 9 long x_;| 10 lon原创 2014-04-11 12:28:46 · 645 阅读 · 0 评论 -
详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握对于程序员来说,数据结构是必修的一门课。从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。不过,等你开始应用计算机语言来工作的时候,你会发现,面对不同的需求你需要一次又一次去用代码重复实现这些已经成熟的算转载 2014-05-30 10:09:03 · 832 阅读 · 0 评论 -
学习 Intel 线程构建块开源库
简介我们发现了 POSIX 线程和基于 Windows 的线程的一种强大替代,即 Intel 线程构建块,该构建块是专为并行编程而设计的基于 C++ 的框架。0 评论:Arpan Sen, 独立作家2012 年 2 月 27 日内容并行编程是未来的发展趋势,但是如何实现高转载 2014-06-19 13:27:04 · 1564 阅读 · 0 评论 -
execvp:在程序中调子程序并获取返回值
在linux中我们可以很方便的使用system启动子程序,但是system有个不足就是它对子程序的掌控很弱,连返回数值都很难获取。下面是一段使用execvp来调用子程序的示例代码,关于下面的代码有几点特殊说明:1) folk(): 会从主程序中复制出一个新的程序,如果folk返回0就是子程序,否则那就是还是当前的程序。2) wait() : 在主程序中你可以自己决定要等待子程序返回原创 2014-09-12 15:31:39 · 11220 阅读 · 0 评论 -
编程小技巧:类C语言的__FILE__ 和 __LINE__
所谓的类C语言就是和java相对的语言,原创 2014-08-23 14:13:14 · 799 阅读 · 0 评论 -
C++学习之sqlite
很久之前就用过sqlite,但是现在已经完全没有概念了,再次学习是个很苦恼的过程,所以就写下如下文章作为备份。首先sqlite如其名,是一个lite的数据库,lite体现在什么地方?体现在不用一个单独的服务器,可以直接集成到当前的程序之中,比较适合APP保存一些自身的数据,其并不太适合做大型网络的数据库。1)工具sqlite有一套很好的上手工具,非常方便我们做一些测试,下面的一串she原创 2014-03-22 00:33:16 · 905 阅读 · 0 评论 -
C++代码收藏
class TypeInfo{public: int id; const char* name;public: static const TypeInfo* get(int id){ return (&typeList][id]); }private: static const TypeInfo typeList[];};/*st原创 2014-08-12 16:05:22 · 861 阅读 · 0 评论 -
提升C++大量赋值性能
原来以为memory copy,在大量赋值的时候会有出色的表现,至少会有从N到log N 的提升,因为可以只调用log N 次的memory copy就可以完成所有的赋值操作, 但是在O3的作用下实际情况更加糟糕。 void fastRangeAssign(int start, int end, complexF value){ int rang原创 2013-07-16 16:55:07 · 1708 阅读 · 0 评论 -
Optimizing Memcpy improves speed
http://www.embedded.com/design/embedded/4024961/Optimizing-Memcpy-improves-speedKnowing a few details about your system-memory size, cache type, and bus width can pay big dividends in higher p转载 2013-07-16 11:44:17 · 735 阅读 · 0 评论 -
空括号的好处
int vaue;{ int a = 3; int b = 4; value = a+b;}括号的好处:可以让程序的逻辑结构更加明了 比如上面的意义就是要获取一个value, 以后多多添加这样的空括号。另外空括号还可以防止名字重复定义。原创 2013-07-08 14:46:26 · 1124 阅读 · 0 评论 -
如何完整打印float or double
我们常用的cout qDebug() 都是默认取的6位有效数字,并不能完整的显示所有的数据内容,因此对于Qt程序, 用QString::number (a, 'g',15); 来打印完整的double, c中应该也有类似的打印代码。原创 2012-08-09 13:23:58 · 4285 阅读 · 0 评论 -
Duff's device(C循环展开)
Duff's device实际上就是用循环展开的方式来提高程序效率的办法,循环展开可以有效利用CPU资源提升效率,当然我们也可以不借助它,可以分两步走,第一步展开,第二步计算剩下部分,但是代码不简洁,通用性也没有这个强。下面介绍下Duff's device,假定要copy 20 个字节int count; // Set to 20{原创 2013-02-05 21:50:17 · 1746 阅读 · 1 评论 -
A Lightweight Logger for C++
http://www.drdobbs.com/cpp/a-lightweight-logger-for-c/240147505?pgno=1Building a lightweight, thread-safe logger that can be redirected to different I/O channels.In this article, I want to转载 2013-02-05 22:06:21 · 2639 阅读 · 0 评论 -
栈的size极限
最近遇到一个分配数组crash的问题class AAA{public: AAA():a(0),b(0){} int a; int b;};如果我写到AAA[1e6]可能就会crash, 查了下最后得到的结论和stack的size相关 stacks for threads are often smaller.You c原创 2013-01-22 10:25:47 · 740 阅读 · 0 评论 -
coroutines(协程)
coroutines其实就是让程序可以很简单的在不同的任务之间切换,它和可以提高软件效率的线程完全是两个概念,它不具有提升软件效率的功能,它本身更多的是一种软件设计架构上的概念,而不关乎效率,换句话而言,其实用其他的办法一样可以实现相同的功能,只是通过协程来表达更佳直观符合人们的逻辑。现在很多语言都嵌入了coroutines, C/C++没有直接支持,但是C可以参照http://swtch.c原创 2013-02-05 22:53:31 · 1016 阅读 · 0 评论 -
C++ union(只支持基础类型)
遇到一个union里面放一些非基本类型编译不通过的问题,查了一下得到如下解释Current C++ standard does not allow non-POD types inside unions. Hence you get this compiler error from gcc.Instead of using C unions, you should use bo原创 2012-12-26 15:31:11 · 1220 阅读 · 0 评论 -
Performance testing shared vs. static libs
I wrote these tests to see how much slower it is to call into a sharedlibrary than it is to call into a static library. My intuition wouldsay that shared is slower, of course, but by how much?The转载 2013-01-22 17:20:03 · 597 阅读 · 0 评论 -
Performance of STL vector vs plain C arrays
static c array = boost arraydynamic c array = stl vector最近用vector代替c arrays,效率变差了好几倍,查到下面一篇很好的文章,从文章中我们可以得到一些很重要的结论如果是出于效率考虑1 如果有海量的小数组,请不要使用vector, 因为在此的效率影响很大, 直接放到stack里。2 如果没有安全考虑,转载 2013-01-22 11:38:17 · 780 阅读 · 0 评论 -
IEEE 754-1985 浮点数标准文档
对浮点数的理解对计算误差和可能的程序效率的低下的理解很有帮助IEEE 754-1985 was an industry standard for representing floating-point numbers in computers, officially adopted in 1985 and superseded in 2008 by IEEE 754-200转载 2013-03-08 18:32:34 · 4282 阅读 · 0 评论 -
C语言中的指针加减偏移量
http://blog.csdn.net/dobest9014/article/details/5369728首先看一段程序:[cpp] view plaincopyprint?#include int main() { int a[5] = {1, 2, 3, 4, 5}; int* p = (int*)(&a + 1);转载 2013-03-13 12:38:59 · 2267 阅读 · 0 评论 -
log4cpp(Log library for C++) 跟踪项目的日志
http://www.ibm.com/developerworks/cn/linux/l-log4cpp/index.html简介: log4cpp是个基于LGPL的开源项目,是基于优秀的日志处理跟踪项目Java语言的log4j移植过来的。log4j介绍的文档很多,在java领域使用的也比较广泛,而这个功能强大的库对国内的C++语言开发人员却使用的不多。这里从开发人员使用的角度介绍这个库,使开转载 2013-03-02 10:34:31 · 4879 阅读 · 0 评论 -
C关键字volatile
推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variab转载 2013-03-26 10:43:35 · 599 阅读 · 0 评论 -
folly (facebook opensource library)
https://github.com/facebook/folly/blob/master/folly/docs/Overview.md主要是对现有的boost和stl的某些内容进行速度和内存使用上的优化,其中大量的都是关于多线程和并发设计的优化,且对C11的特性都有所使用。1.small_vectorShort-lived stack vectors with原创 2013-04-25 16:15:38 · 1361 阅读 · 0 评论 -
float vs double
在精度有要求的程序千万不要用float, 以免出现很多意料之外的bug。原创 2013-05-16 15:44:11 · 681 阅读 · 0 评论 -
深入剖析 linux GCC 4.4 的 STL string
深入剖析 linux GCC 4.4 的 STL stringPosted on 2012 年 11 月 26 日 by zieckey本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。平台:x86_64-redhat-linuxgcc version 4.4.6 20110731 (R转载 2013-06-06 13:42:41 · 975 阅读 · 0 评论 -
小心C语言的定义与声明
注:为便于说明问题,文中提及的变量和函数都被简化。一、起源DBProxy在测试过程中,发现对其执行某步管理操作后,程序有时会崩溃,但不是每次都出现。二、GDB跟踪反复多次测试,然后用GDB打开core dump文件,查看程序崩溃时的堆栈,发现可能的崩溃只有两处,这两处的共同点是前面都调用了一个函数get_pointer得到一个指针,如下图所示:然后在使用转载 2013-06-06 13:53:54 · 1032 阅读 · 0 评论 -
破解软件的思路
核心思想:objdump -d 找到关键汇编代码,然后用ghex2 打开可执行程序,修改和汇编对应的机器码,当然前提是对汇编足够了解。下面讲一个简单在linux上的例子:1. 先建立一个简单的程序,#include using namespace std; bool abc(){ return false; }int main(int argc, char *argv原创 2013-06-06 15:31:56 · 1899 阅读 · 0 评论 -
全局变量、局部变量、静态全局变量、静态局部变量的区别
文章出自: http://www.cnblogs.com/chenglei/archive/2009/09/06/1561367.htmlC++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。从作用域看:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括转载 2015-06-07 16:38:04 · 983 阅读 · 0 评论