registe关键字修饰
- C的关键字修饰:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。省去了CPU到内存中抓取数据的时间。
- register : 不能修饰全局变量,也不能修饰函数,只能修饰局部变量。
- static : 局部变量,全局变量,函数都可以修饰。
注意在c中变量存在寄存器后就不能取地址,因为取地址是去内存的地址,但变量已经可以能被存在寄存器里了。
- C++的升级:
- 可以取地址,如果取地址,则将变量重新加载到内存中;
- volatile: 防止编译器将所修饰的变量加载到寄存器中进行优化
引用 vs 指针
- C++ 引用 vs 指针(都可以做形参和返回值): 指针容易造成段错误;引用则代表是变量的另一个别名,操作引用等于操作变量本身。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。不存在空引用。引用必须连接到一块合法的内存。指针可以在任何时间被初始化。
- 本质:指针是数据类型,引用是一种变量别名。
- 内存分配:都占用内存空间,但指针可以操作,引用则自动被系统优化,用户无法访问。
级数:指针可以多级指针但引用最多到两级(右值引用)。
使用效率:引用高于指针。 - 使用:
int i;
int &n = i; //n即为i的引用,操作不分彼此。但引可以做形参。
- 优点:
- 交换实参值时避免使用内存而造成可能出现的内存错误;
- 引用做函数的返回值,使函数的调用可以作为左值;(函数不能返回局部变量或地址,因为函数执行结束后就会释放空间)
-
引用的分类:左值引用和右值引用(注意左值引用只能绑定左值,右值引用只能绑定右值)引用占内存空间,但用户无法访问
&:左值:可以对该值取地址或者可以修改; &&:右值:不能对该值取地址或者修改该值;通过&&定义,是一个右值引用的名字,但定义的右值本质上还是左值,需要用<font color = tomato>std::move()</font>转化成右值
- 左值引用:替代指针的操作
- 右值引用:临时对象开销问题(对象移动)
const修饰
- const:修饰一个变量(全局,局部)、修饰函数返回值
- 作用:指定一个语义约束,让编译器将修饰的变量标记为只读变量(但并不等于常量,只是不可以通过变量名修改)。
- 注意事项:const修饰一个变量必须初始化(因为一旦修饰就不能再去修改所以需要初始化)
好处:可以防止函数调用时改变变量的值
- c++的升级:
- 将修饰的变量标记为常量,不可以x,不可以修改;
- 指针和引用的赋值操作必须是const对const;
- 多出常量表达式constexpr(vs const:在编译过程中就得到计算结果)
动态内存分配
- 动态内存分配(new,delete)
- c:malloc free 标准使用
char *ptr = (char *)malloc(sizeof(char) *100);
if(ptr == NULL)
{
printf("malloc error!\n");
exit(1);
}
...
...
free(ptr);
ptr = NULL
- c++:new,delete 标准使用:
int *ptr = new int[100]; //int p[100];
int *p2 = new int; //int *p2 = (int *)malloc(sizeof(int));
int *p3 = new int(5); //初始化为5
...
...
delete p2;
delete p3;
delete [] p;
- new vs malloc
- new即能分配空间,也能初始化空间,malloc只能分配空间,不能初始化
- new是按照数据类型的个数为单位分配,malloc是按照字节为单位分配空间
函数指针
- c
typedef int(*P_FUNC)(int,int);
//P_FUNC p_func=函数名;
- c++
using P_FUNC int (*)(int,int);