随笔分类 - C/C++等
摘要:[存储管理]一个c程序在内存中的映射分为哪几部分?高地址(3G)...stack...heapbssdatarodatatext...低地址(0)在用户存储空间,一个c程序的映射可分为6部分,代码段、常量段、数据段、bss段、堆、栈。其中:常量主要是指字符串常量;数据是指函数外定义的、初始化过的变量;bss是指函数外定义的、未初始化过的变量;局部变量、子函数返回地址、传给子函数的参数都在栈中分配,...
阅读全文
摘要:1.两个数比较大小 #define min( x,y) ({ \ typeof( x) _x = ( x); \ typeof( y) _y = ( y); \ (void) (&_x == &_y); \ //妙用!作用是检查参数...
阅读全文
摘要:首先,C++标准中提到,一个编译单元[translation unit]是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE[Portable Executable,即Windows可执行文件]文件格式,并且本身包含的就已经是二进制码,但是,不一定能够执行,因为并不保证其中一定有m...
阅读全文
摘要:Gof 模式 以下的设计模式则是我个人从 Gof 学习中的个人体会与实作,并增加几个导入或衍生的简单模式。 Creational 模式 物件的产生需要消耗系统资源,所以如何有效率的产生、管理与操作物件,一直都是值得讨论的课题, Creational 模式即与物件的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向。Simple Factory 模式 Abstract Factory 模式 ...
阅读全文
摘要:常用的字符串处理函数 字符串标准函数的原型在头文件string.h中。 1.输入字符串──gets()函数 (1)调用方式:gets(字符数组) (2)函数功能:从标准输入设备(stdin)──键盘上,读取1个字符串(可以包含空格),并将其存储到字符数组中去 (3)使用说明 1)gets()读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串。 2)该函数输入的字符串...
阅读全文
摘要:一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开...
阅读全文
摘要:C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast expression to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我把这两种形式称为旧风格(o...
阅读全文
摘要:仿函数(functor): 重载了"()"运算符的struct,例如: struct D { D(int i=0){num=i;} int num; }; struct print_D{ void operator()(const D* d)const{ cout<<"I am D. my num="<<d->num<<endl; } }; in...
阅读全文
摘要:封装的开销 C++类的成员数据直接包含在每个对象内部,而noninline成员函数虽然在类中申明,但不会出现在每个对象内部。 每个noninline的成员函数仅产生一个唯一的函数实体。而inline函数在会为每个使用者身上生成一个函数实体。 因此C++类的封装并未带来任何空间或执行期间的不良,仅仅因为virtual的原因带来一些时间上的额外负担。 (1) virtual function 机...
阅读全文
摘要:1,什么是字节顺序指的就是数据在内存里存储的顺序,通常我们默认一个存储单元为1Byte,一个逻辑数据比如Float是4个Byte,它在内存理存储的顺序可以是高位在前,也可以是低位在前.这样就有区分了.2,有些什么顺序:Big-Endian(MSB),高位在低地址Little-Endian(LSB),低位在低地址Endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系3,...
阅读全文
摘要:多线程编程离不开锁,可加锁会引起性能,甚至是死锁,那到底什么是多线程安全的? 1.局部变量局部使用是安全的 每个thread 都有自己的运行堆栈,而局部变量是生存在堆栈中,大家不干扰。 {int local1; ++local1;} 是安全的 2.在32机器上,4字节整形一次assign是原子的 比如i =10; //thread1i=4; //thread2不会导致i的值处于未知状态,要么是10...
阅读全文
摘要:1. string.find等查找的结果要和string::npos比较,而不是和-1比较。(各个平台可能不同) 2. 将string转为char * ,用char * t = (char *)s.c_str() ,而不是 char *t =s.begin() 或者 char *t = &s[0] 或者 char *t =s.data(); 3. vector中的元素被C++标准限定为存储...
阅读全文
摘要:由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如: static int i=0; int main(void) { ... while (1) { if (i) dosomething(); //dosomething永可能远也不会被调用 } } /* Interrupt service routine. */ void ISR_2(void)...
阅读全文
摘要:关键字清理堆栈参数入栈顺序函数名称修饰(C)__cdecl调用函数右 à 左_函数名__stdcall被调用函数右 à 左_函数名@数字__fastcall被调用函数右 à 左@函数名@数字thiscall(非关键字)被调用函数右 à 左/在C语言中,假设我们有这样的一个函数:int function(int a,int b)调用时只要用re...
阅读全文

浙公网安备 33010602011771号