持续更新

概念性区分

1.C和C++的区别
C面向过程,C++面向对象
C的内存管理使用malloc free,C++还可以使用new delete
C不支持函数重载,C++支持函数重载
C没有引用,C++可以用引用
堆和栈的区别
stack编译器自动分配和释放,自底向上的数据结构
heap需要由程序员手动new delete,会产生外部碎片,是自上到下的数据结构
c++中不能被继承的成员函数
析构函数和构造函数
const
定义常量
修饰函数参数和函数返回值

修饰函数定义体,函数为类的成员函数,const修饰后的成员函数不修改成员变量的值

define给一个立即数,const是常量,放在静态区域,全局变量也在静态区域
静态区:static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放
const的全局变量存储在只读数据段,第一次使用时被分配内存,结束时释放;const的局部变量存在栈中,代码块结束释放
define定义的常量不可以用指针去指向,const定义的常量可以用指针去指向该常量的地址
–const优点
const 常量有数据类型,而宏常量没有数据类型。
编译器可以对前者进行类型安全检查,
后者只进行字符替换,没有类型安全检查,并且在字符替换可能报错。
[全局变量放在静态存储区,整个程序开始分配内存,结束释放]
static
static修饰的变量只能通过其所在文件、模块或函数进行调用,限制变量
static修饰的变量一开始就得初始化,并存放于静态内存区
volatile
本条指令不会因编译器的优化而省略,不会被编译器察觉(隐藏变量),且要求每次重新读取volatile修饰的变量的内容
extern

指针和引用的区别
引用本质是只读指针,引用只能在初始化时被赋值,且必须被初始化,之后不能改变,指针是动态的
引用不能为NULL,指针可以
引用做函数参数时,内部传递的是变量地址
进程间通信
pipe管道,半双工,用于父子进程通信
semaphore信号量,进程同步访问共享资源
message que 消息队列,克服了缓冲区限制
shared memory共享内存
socket
线程间通信
全局变量 Messages消息机制;
CEvent对象(MFC中的一种线程通信对象,通过其触发状态的改变实现同步与通信)

编译时运算符:sizeof

写一个函数指针
( ( void ()() ) 0x100000) ( );
void()()强制转换0x100000
typedef void(
)() voidFunc;
*( (voidFunc)0x100000 )();

内存分配方式

从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。

在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。