随笔分类 -  c、c++

1 2 3 下一页

局部标签(gcc对c的扩展)
摘要:每个语句内嵌表达式都是一个可以声明局部跳转标签的域。一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做。一个局部标签的申明如下:__label__ label;或者:__label__ label1, label2, ...;局部标签的申明必须在语句内嵌表达式的开始出,紧跟({后面,在所有通常申明的左边。局部标签申明只是定义了标签的名字,但是并没有定义标签本身。 你必须用通常的标签使用方法来在语句内嵌表达式内部使用局部标签。由于语句内嵌表达式经常用于宏,所以局部标签特性非常有用。如果在宏里包含了循环,一个goto能很有效的跳出循环。然而通常的标签的作 阅读全文

posted @ 2013-07-26 11:22 山本二十八 阅读(406) 评论(0) 推荐(0)

Valgrind查找内存泄露利器
摘要:Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:Memcheck 工具主要检 阅读全文

posted @ 2013-06-28 16:08 山本二十八 阅读(859) 评论(0) 推荐(0)

取得进程信息
摘要:#ifdef AIXINT32 CProcessState::GetProcessState(const INT64 lPid, TProState* pProcessState){ INT32 nRet = ZX_SYS_NO_ERROR; char cState = CHAR_SNONE; pid_t pid = lPid; INT32 nState = 0; INT64 lPageSize = 0; struct procsinfo pi; if (pProcessState == NULL) { ZX_ERROR(LOG_N... 阅读全文

posted @ 2013-05-24 00:04 山本二十八 阅读(389) 评论(0) 推荐(0)

打印堆栈信息
摘要:#ifdef OS_IBM sprintf(szCmd,"%s %d >>%s", "procstack", getpid(),abnTraceFileName); system(szCmd);#else sprintf(szCmd,"%s %d >>%s", "pstack", getpid(),abnTraceFileName); system(szCmd); #endif 阅读全文

posted @ 2013-01-10 10:57 山本二十八 阅读(393) 评论(0) 推荐(0)

effective c++ 读书笔记
摘要:1、const char* const authorname = "Scott"2、无法用define创建一个class专属常量,因为define并不重视作用域。一量定义 ,它就在其后的编译过程 中都有效3、对于单存常量,最好以const对象或enum替换 define (宏使用的名称未进入记号表) 对于形似函数的宏,最好改用inline函数替换define 参数如果不需要更改,定义为const4、const成员函数。const成员函数才可被const对象调用5、bitwise constness (又称physical constness):不更改对象之任何成员变量(st 阅读全文

posted @ 2012-10-31 10:45 山本二十八 阅读(201) 评论(0) 推荐(0)

static_cast、dynamic_cast reinterpret_cast
摘要:关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static_cast用法:static_cast < type-id > ( expression_r_r )该运算符把expression_r_r转换为type-id类型,但没有运行时类型检查来保 阅读全文

posted @ 2012-10-28 11:07 山本二十八 阅读(252) 评论(0) 推荐(0)

不要在析构函数中抛出异常
摘要:1: 可以在析构函数中抛异常吗? 不可以! 虽然语法上并没错,但会对整体系统带来重大隐患!!2: 那么如何保证析构不抛异常呢? 2.1)析构里如同构造函数一样,做一些简单的操作。 2.2)如果异常不可避免,那么直接在析构里捕获异常,不要让异常逃离析构函数!3: 析构里抛异常有什么危害呢? 阻止异常传递到析构函数外有两个原因,第一能够在异常转递的堆栈辗转开解(stack-unwinding)的过程中,防止terminate被调用。第二它能帮助确保析构函数总能完成我们希望它做的所有事情。 //////////////////////////////////////////////////////. 阅读全文

posted @ 2012-10-22 15:33 山本二十八 阅读(1136) 评论(0) 推荐(0)

set_new_handler
摘要:如果每次new出来 ,都要判断是否成功(地址是否为空),那么也挺麻烦的。c++提供set_new_handler,当new失败时,会调用set_new_handler设置的回调函数。functionstd::set_new_handler<new>new_handler set_new_handler (new_handler new_p) throw();Set new handler functionSetsnew_pas thenew handlerfunction.Thenew handlerfunction is the function that is called b 阅读全文

posted @ 2012-10-10 10:16 山本二十八 阅读(1842) 评论(0) 推荐(0)

Placement new
摘要:placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; }首先我们区分下几个容易混淆的关键词:new、operator new、placement newnew和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的。要实现不同的内存分配行为,需要重载operator new,而不是 阅读全文

posted @ 2012-10-09 09:45 山本二十八 阅读(174) 评论(0) 推荐(0)

【转】makefile的双冒号规则
摘要:在编译一个软件包时看见下面rules文件中出现“binary-predeb/gir1.0-unique-1.0::”,对这里的双冒号很是不解,经查阅资料,才明白一点儿。#!/usr/bin/make-finclude/usr/share/cdbs/1/class/autotools.mkinclude/usr/share/cdbs/1/rules/debhelper.mkinclude/usr/share/cdbs/1/rules/simple-patchsys.mkinclude/usr/share/cdbs/1/rules/utils.mkinclude/usr/share/cdbs/1/ 阅读全文

posted @ 2012-09-10 10:43 山本二十八 阅读(1325) 评论(0) 推荐(1)

堆排序
摘要:make_heap, push_heap, pop_heap, sort_heap“堆”定义 n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。看如下代码:#in 阅读全文

posted @ 2012-09-10 10:16 山本二十八 阅读(163) 评论(0) 推荐(0)

静态链接库顺序问题
摘要:前几天,遇到一个在hpux机器上,一个程序链接时既使用了动态库,又使用了静态库,而且把静态库放在动态库的前面。链接时报找不到符号的错误。而该符号已经在静态库中定义了。 今天恰好在 《C专家编程》中找到答案,如下: 在动态链接和镜头链接的语义上有一个巨大差别,archive(静态库)与共享对象(动态库)的动作不同。在动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的。相反,对于静态链接,在处理archive时,它只是在archive中查找载入器当时所知道的未定义符号。因此,使用静态链接的过程中,引入静态链接库的顺序是很重要的。如果相同的符号在... 阅读全文

posted @ 2012-09-09 22:30 山本二十八 阅读(2155) 评论(0) 推荐(0)

编译期断言
摘要:书中列出三种编译期断言的实现方式,一一列出:CompileTimeAssertion.h//第一个版本使用不能建立空数组的性质#defineSTATIC_CHECK1(expr)\{\charunnamed[(expr)?1:0];\}//第二个版本使用模板的非类形参,使用为定义类是违法的template<bool>structCompileTimeError;//声明一个模板template<>structCompileTimeError<true>{};//仅仅对模板参数为true的特化实现#defineSTATIC_CHECK2(expr)\(Comp 阅读全文

posted @ 2012-09-03 08:16 山本二十八 阅读(347) 评论(0) 推荐(0)

函数适配器之绑定器
摘要:标准库定义了两个绑定器适配器:bind1st和bind2nd。每个绑定器接受一个函数对象和一个值。bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。例如,为了计算一个容器中所有小于或等于10的元素的个数,可以这样给count_if传递值: count_if (vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10));详细代码可查看 boost源码或者 vc源码 (functional) 阅读全文

posted @ 2012-09-01 10:14 山本二十八 阅读(295) 评论(0) 推荐(0)

C++箴言:理解typename的两个含义
摘要:问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses "typename" 答案:没什么不同。在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西。一些程序员更喜欢在所有的时间都用 class,因为它更容易 阅读全文

posted @ 2012-09-01 09:57 山本二十八 阅读(183) 评论(0) 推荐(0)

字节对齐
摘要:#pragma pack(n) : 以n字节对齐#pragma pack() : 恢复默认对齐方式 IBM:IBM可以通过-qalign编译选项指定对齐方式 ,但是#pragma pack覆盖掉它#pragma pack(pop) 等同于 $pragma pack()。每次#pragma pack的设置会进栈,pop就相关于把最近一次的出栈xlc有一套 #pragma options align 也可以指定对齐方式,如#pragma options align=packed :相关于#pragma pack(1)#pragma options align=reset:恢复到前一个#pragma 阅读全文

posted @ 2012-08-29 10:08 山本二十八 阅读(245) 评论(0) 推荐(0)

c函数调用过程
摘要:C代码:int fun(int para){ int a=0; return 0;}void main(){ fun(1);}汇编代码:1:2:3: int fun(int para)4: {0040B810 push ebp ;保护寄存器ebp0040B811 mov ebp,esp ;此时ebp=esp;此后ebp一般不变0040B813 sub esp,44h ;44即为40Bytes间隔空间+fun内部变量占有空间,此时fun仅定义一int型变量a,故为4Bytes0040B816 push ebx ;保护ebx0040B817 push esi ;保护esi0040B818 push 阅读全文

posted @ 2012-08-28 17:08 山本二十八 阅读(836) 评论(0) 推荐(0)

堆栈中的EIP EBP ESP
摘要:EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。我们DC上讲过栈的数据结构,主要有以下特点:后进先处。其实它还有以下两个作用:1.栈是用来存储临时变量,函数传递的中间结果。2.操作系统维护的,对于程序员是透明的。我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。先写个小程序:void fun(void){ printf("hello world");}voidmain(void){ fun() printf("函数调用结束"); 阅读全文

posted @ 2012-08-20 16:20 山本二十八 阅读(710) 评论(0) 推荐(0)

不定参数
摘要:在unix中,相应的头文件为<stdarg.h>【函数参数在堆栈中的分步】 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后... 阅读全文

posted @ 2012-08-14 19:22 山本二十八 阅读(369) 评论(0) 推荐(0)

unix编译
摘要:1、查看test.cpp包含了哪些头文件 1.1 AIX xlC -M test.cpp编译选项。编译完后后生成一个.u文件。 2.2 HP-UX aCC -H test.cpp 2.3 Linux g++ -M test.cpp2、对test. cpp进行宏替换 cpp(The C Preprocessor)是unix编译器用来进行宏替换的工具。在编译的时候 ,有时遇到因宏替换而出现的问题,可以调用cpp 输出宏替换后的结果,这样就容易查问题了。 1.1 AIX cpp test.cpp xlC -E -c test.cpp 1.2 HP-UX hpux的cpp工具在/lib... 阅读全文

posted @ 2012-08-08 15:23 山本二十八 阅读(258) 评论(0) 推荐(0)

1 2 3 下一页

导航