各种类型内存占用
分32位和64位
32位(内存字节)
char(1)
short(2)
int(4)
long(4)
long long(8)
float(4)
double(8)
long double(8(vs)/12(gcc))
size_t/ssize_t(4)
所有指针(4)
64位
char(1)
short(2)
int(4)
long(8)
long long(8)
double(8)
long double(8(vs)/16(gcc))
size_t/ssize_t(8)
所有指针(8)
以上所有无符号和有符号占用一样
堆和栈区别
堆和栈都是在内存上面分配空间,区别:
管理方式
栈:系统分配内存,自动回收
堆:手动分配,手动释放
内存大小
栈的内存空间小,固定受限
堆的空间大,几乎受限于整机内存大小
分配方式
栈:连续内存,向下增长
堆:零散内存,向上增长
访问速度
栈快,堆慢
生命周期
栈随函数调用/结束自动存亡
堆由代码控制生命周期
cin,get,getline区别
cin
c++的输入函数,读取输入,遇到空格或者\n就会停止比如
hello world,就只会读取到hello,末尾有\n会保留在缓冲区中。
get
无参的时候读取单个字符,包括换行空格。有参的时候读取一行,遇到\n停止,\n保留在缓冲区。
getline
读取一行,遇到\n停止,\n会读出来丢掉
getline(cin,str)
c++专属,整行读取,不限定长度,string自动扩容,遇到换行停止,\n自动丢弃。
get和getline区别
就是\n,get会不动他,getline会读取出来丢掉
坑点
cin和get/getline混用的时候比如:
cpp
char str[100];
cin>>a;
cin.get(str,100);
cin了以后缓冲区中会残留\n,get或者getline看到\n会直接停止了,那么怎么解决这个问题呢,书上是在cin了以后调用一次get把\n吃掉,我网上查还有用ignore清掉残留。
string内存坑点
string是c++的变量类型,string的结构是指针+容量+大小+内部短字符缓冲区。
sizeof 测量的是string对象本身的大小,64位sizeof(str)=32字节,32位sizeof(str)=24字节,与存放的字符串长度无关。如果字符串<=15个字符,会存放到对象本身,如果>15个字符,会额外在堆上开辟空间存储len+1,但不影响sizeof(str)。
这里又区分c和c++
c的字符串char* p和char p\[\]
sizeof(p)=8,因为p是指针,不是内容,测量的指针在64位中就是8字节
char p\[\]="abc",数组大小=len+1,字符串末尾会有\0,len是字符个数。
c++的string操作更方便,c语言的两个字符串之间不能直接赋值,类似于数组,要循环加入,或者cstring中的使用strcpy复制或者使用strcat附加实现。而string支持直接赋值,拼接,附加。
另外size和length函数没有区别,返回的都是字符个数(去掉\0后的)
结构体坑点
c和c++的结构体差不多,但是有区别,c++的结构体可以放string类型(c++的专属)以及c++的结构体可以放成员函数,但是放了成员函数就和类没啥区别了。
枚举量坑点
枚举量enum只有赋值运算符没有算数运算符如++,但如果运算的值是有效的可以强制转换
常指针与指针常量
类型用模板T代表
指向常量的指针,用 const T *p或T const *p表示,是一个指针指向一个常量,指针的地址可以改变,但是他所指向的地址存的值不可以改变。
常指针,用 T *const p表示,表示常量指针类型,指针指向的地址不可以改变,但是指向的地址所存的值可以改变
指向常量的常指针,用 const T *const p表示,这种指针指向固定地址,并且该地址存的值也是固定不变的。