摘要:
#include <stdio.h> int main() { int a = 4; printf("a=4\n"); printf("(a)*(++a)=%d\ta=%d\n",(a)*(++a),a); a = 4; printf("(++a)*(++a)=%d\ta=%d\n",(++a)*(++a),a); a = 4; printf("(a++)*(a++)=%d\ta=%d\n",(a++)*(a++),a); a = 4; printf("(a++)*(a)=%d\ta=%d\n 阅读全文
摘要:
inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。表达式形式的宏定义一例:#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))1.为什么会使用表达式形式的宏1).宏的执行效率高。因为它是在代码中需要的位置直接文本替换,没有参数压栈,代码生成等操作,是由预处理器完成的。2).函数的调用需要保存和恢复现场,有一定的时间和空间的开销。2.表达式形式的宏的缺点1).宏不能访问对象的私有和保护成员2).宏不能进行参数有效性检测,返回值也不能被强制转换3).很容易产生二义性3.inl 阅读全文
摘要:
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、文字常量区 —常量字符 阅读全文
摘要:
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐 阅读全文
摘要:
“Short a:4”——指定位数的成员变量结构体或类中有时会见到下面的写法struct s { short a:4; short b:6; short c:8; };这是结构体和类的一种性质,在声明变量的同时指明变量的位数。short类型在32位机上本来是16位的,但从节约空间等角度的考虑,我们觉得用16位来存储有些浪费,有个4位的变量就够用了,怎么办?当然有办法,我们在声明变量的同时,在变量后面加上冒号,再加上数字,表示这个变量只占用这么多位。注意数字不能大于原类型的位数。关于这种结构体在内存中的结构(边界对齐问题)代码内存图示struct s { short a:4; short b:6 阅读全文