OPPO一面
内存分区
内存5个分区:堆、栈、自由存储区、全局/静态存储区、常量存储区
栈 | 就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量存储区,里面的变量通常是局部变量、函数参数等 |
---|---|
堆 | 就是那些由new分配的内存块,他们的释放编译器不管,由我们的应用程序控制,一般一个new就对应一个delete,如果程序员没有释放掉,在程序结束后,操作系统会自动回收。 |
自由存储区 | 就是那些由malloc等分配的内存块,他和堆是十分相似的,不过是用free来释放 |
全局/静态存储区 | 全局和静态存储区(static)被划分在统一存储区中,在以前的C语言中有初始化和未被初始化之分,但在C++中不再区分 |
常量存储区 | 这是一块特殊的存储区,他们存放常量,数值不可修改 |
程序优化的方式
- 合适算法和数据结构
- 使用多线程
- 程序结构优化
- 内存优化(采用合适的内存分配,const,少用全局多用局部等)
memcpy函数的实现
void *memcpy(void *des,const void *src,size_t len)
{
if(NULL == des && src == NULL)
{
return NULL;
}
void *ret = dst;
if(dst <= src || (char *)dst >= src+len){
//没有内存重叠,从低地址开始复制
while(len--){
*(char *)dst = *(char*)src;
dst = (char *)dst +1;
src = (char*)src+1;
}else {
//有内存重叠,从高地址开始复制
src = (char *)src +len -1;
dst = (char *)dst +len -1;
while(len--){
*(char*)dst = *(char*)src;
dst = (char *)dst -1;
src = (char*)src-1;
}
}