随笔分类 -  编译/内存分配释放

摘要:不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位反之,高位值就应该放在内存地址大的地方,也即内存地址高位BE big-endian最直观的字节序地址低位存储值的高位地址高位存储值的低位为什么说直观,不要考虑对应关系只需要把内存地址从左到 阅读全文
posted @ 2013-05-26 21:58 dzqabc 阅读(187) 评论(0) 推荐(0)
摘要:转载:http://www.wuzesheng.com/?p=840C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。1. 函数(Function)(1) operator new functionvoid*::operatornew(size_t);//Globalvoid*class-name::operatornew(size_t);//Class上面是C++中operator new function的原型,一个是全局类型的,一个的类 阅读全文
posted @ 2013-05-09 23:07 dzqabc 阅读(523) 评论(0) 推荐(0)
摘要:在源码中,宏likely和unlikely 是这么定义的(位于include/linux/compiler.h): #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)要理解宏likely和unlikely ,很明显必须理解__builtin_expect。__builtin_expect是GCC(version>=2.9)引进的宏,其作用就是帮助编译器判断条件跳转的预期值,避免跳转造成时间浪费。拿下面的代码来说: if (likely(acat == 1)) 阅读全文
posted @ 2013-04-09 23:17 dzqabc 阅读(702) 评论(0) 推荐(0)
摘要:当内存分配请求不能满足时,调用你预先指定的一个出错处理函数。这个方法基于一个常规,即当operator new不能满足请求时,会在抛出异常之前调用客户指定的一个出错处理函数——一般称为new-handler函数。(operator new实际工作起来要复杂一些,详见条款8)指定出错处理函数时要用到 set_new_handler 函数,它在头文件<new>里大致是象下面这样定义的: typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();可以看到,new_handler 是一 阅读全文
posted @ 2012-12-03 22:42 dzqabc 阅读(429) 评论(0) 推荐(0)
摘要:最简单的知识有时间记忆回忆起来却最难. 1.类型转换会生成临时变量 (const std::vector<ACE_INT32>)类型转换将导致生成新的临时变量. 所以先做类型转换,再取其地址或其内部属性地址时危险的. 1.1.signed、unsigned 分别指的是signed int和unsig 阅读全文
posted @ 2012-06-17 23:27 dzqabc 阅读(773) 评论(0) 推荐(0)
摘要:数组定义时长度可以使用变量不是很清楚了,自己写的是可以的,可能新版本编译器已经支持函数调用时动态分配数组空间了吧,使用g++是编译成功了。 动态长度的栈区数组是C99的特性。在C99之前,在栈区分配动态大小的内存块是使用alloca函数,不过由于不在堆中,分配出来的内存不需要释放滴int len;c 阅读全文
posted @ 2012-02-12 22:27 dzqabc 阅读(4043) 评论(0) 推荐(0)
摘要:概述 C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。 下面结合问题分别进行阐述。 阅读全文
posted @ 2012-02-04 23:20 dzqabc 阅读(1495) 评论(0) 推荐(0)
摘要:__attribute__是GNU C提供的一种机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 __attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。 __... 阅读全文
posted @ 2012-01-14 15:42 dzqabc 阅读(494) 评论(0) 推荐(0)
摘要:众所周知,程序为了提高访问效率,编译器在编译的时候,进行字节对齐。程序员也可以字节指定对齐方式。 Win32下的为progma指令,具体来说 #pragma pack(push) //保存原对齐状态#pragma pack(4)//设定为4字节对齐struct test{ int a;};#pragma pack(pop)//恢复对齐状态在linux下,gcc是默认的编译器。g++ 支持pro... 阅读全文
posted @ 2012-01-14 15:23 dzqabc 阅读(1393) 评论(0) 推荐(0)
摘要:编译器对结构在编译过程中会优化对齐,由于编译器的内存对齐,当一个char变量独立存在时,会分配一个int大小的空间,当两个char连续存在时,会给两个char分配一个int大小的空间. class CMemoryTest { int a; char b; int c; char d; }; class CMemoryTest1 { int a;... 阅读全文
posted @ 2012-01-14 15:02 dzqabc 阅读(3576) 评论(0) 推荐(0)
摘要:BOOL 定义 typedef int BOOL; #define FALSE 0 #define TRUE 1 不能完全重载(BOOL的本质就是int),如: //file.h void f(int ); // ok void f(BOOL); // ok // file.cpp void f(int) {/*….*/} // ok void f(BOOL) {/*….*/} // 错误,重新声明bool(false,true)是C++内置的类型,可以避免上述的问题。bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以来说:false/true只占 阅读全文
posted @ 2012-01-14 14:25 dzqabc 阅读(3276) 评论(0) 推荐(0)
摘要:新版本的录制程序终于快完工了,在添加了一个新特性“报警录制”后,就开始测试了。 一开始就不顺利:程序正常运行一段时间后就会崩溃,由于程序添加了守护进程,在崩溃后会自动重启。 因此测试得到的结果就是:程序运行一段时间后就自动重启,并不断持续;有时几个小时重启一次,有时甚至每分钟都重启。 废话少说,开始定位问题: 1.去掉自动重启功能,在gdb下运行,20多分钟后就崩溃了: 2011-10-26 1... 阅读全文
posted @ 2012-01-09 23:11 dzqabc 阅读(9387) 评论(0) 推荐(0)
摘要:一、程序运行平台 不同的平台上对不同数据类型分配的字节数是不同的。 个人对平台的理解是CPU+OS+Compiler,是因为: 1、64位机器也可以装32位系统(x64装XP); 2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的); 3、即使是32位的编译器也可以弄出64位的inte... 阅读全文
posted @ 2011-12-15 22:17 dzqabc 阅读(24933) 评论(0) 推荐(5)
摘要:1、 概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书。这就是“拖延战术”,直到你非要做的时候才去... 阅读全文
posted @ 2011-11-21 22:23 dzqabc 阅读(1205) 评论(0) 推荐(0)
摘要:一、程序运行平台 不同的平台上对不同数据类型分配的字节数是不同的。 个人对平台的理解是CPU+OS+Compiler,是因为: 1、64位机器也可以装32位系统(x64装XP); 2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的); 3、即使是32位的编译器也可以弄出64位的int... 阅读全文
posted @ 2011-11-21 21:12 dzqabc 阅读(528) 评论(0) 推荐(0)
摘要:注:不知道说“偷调函数”说法合不合适,在此也就这样一说了~ 主要有两点: 一、再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者 二、在 1 的基础上,在WinDbg下通过修改EIP实现如下一个功能: 有两个函数foo()和hack(),在main函数中调用foo,但是在foo执行过程中,通过修改EIP来调用hack函数,最后再回到main中foo函数的下一条语句 ... 阅读全文
posted @ 2011-11-14 22:12 dzqabc 阅读(561) 评论(0) 推荐(0)
摘要:通常在使用VC进行函数定义时会指定该函数调用方式,诸如: int__stdcallmax(int a, int b) { returna>b?a:b; } int__cdeclmin(int a, int b) { returna<b?a:b; } bool__fastcallequal(int a, int b) { returna=b?true:false; }首先,让我们来分个类,调用方法分为两大类另加一个较特殊的__thiscall.第一类:__stdcall类 别名:WINAPI,CALLBACK,PASCAL。该类特点是:主调函数负责参数入栈,由函数本身负责栈的恢复.第 阅读全文
posted @ 2011-10-31 22:06 dzqabc 阅读(697) 评论(0) 推荐(0)
摘要:首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。接着就是析构函数了,上面说到子类是将基类的成员变成自己的成员,那么基类就会只存在子类中直到子类调用析构函数后。做个假设:假如在基类的析构函数调用比子类的先,这样会发生什么事呢?类成员终止了,而类本身却还 阅读全文
posted @ 2011-10-31 20:56 dzqabc 阅读(3967) 评论(1) 推荐(3)
摘要:在ACE的源代码目录里,有源文件.cpp、头文件.h,我们还发现有以.i和.inl为扩展名的文件。其实,以.i和.inl为扩展名的文件是ACE源码中inline函数的存放形式。在说明ACE中为什么采用这种方式来存放inline函数之前,我们来说一下inline关键字是什么意识。我们知道当调用一个函数的时候,涉及到返回地址和参数压栈等一些操作,这些操作是函数调用本身的开销。在原来的C代码中,通常采用宏定义的方式模拟函数,来消除函数调用的开销,因此我们知道宏是在预编译时候进行处理的。但是,宏定义本身也有很多缺陷,很容易造成错误的使用。这就是inline关键字诞生的原因。用inline关键字定义的函 阅读全文
posted @ 2011-10-15 22:47 dzqabc 阅读(436) 评论(0) 推荐(0)
摘要:1、如果用容器存副本,则容器销毁的时候,副本也会自动被删除。如果用容器存指针,则容器销毁的时候,不会删除这些指针所指向的对象,因此必须先手工删除完毕之后,再销毁容器。2、如果用容器存副本,其存入、取出的过程是通过拷贝构造函数和赋值操作符来进行的。如果你没有显式地提供这两者,则使用缺省的拷贝构造函数和赋值操作符,其实现方式为:内存复制。例如:假若你没有提供CFileAttribute::operat... 阅读全文
posted @ 2011-07-13 00:56 dzqabc 阅读(595) 评论(0) 推荐(0)