C/C++数组、指针、引用区别 resize和reserve函数原理 c_str和data函数区别
- 2015-03-02 21:26:00
- admin
- 原创 1894
一、C/C++数组、指针、引用区别
1、数组和指针都用来指向内存空间,数组相当于指针常量;
2、引用相当于指针常量,但是引用使用起来更方便;
3、代码示例:array_and_pointer.cpp
数组在定义的位置申请空间,全局区或调用栈:
char str1[] = "abcde";
004114B8 mov eax,dword ptr [string "abcde" (415758h)]
004114BD mov dword ptr [ebp-10h],eax
004114C0 mov cx,word ptr ds:[41575Ch]
004114C7 mov word ptr [ebp-0Ch],cx
指针用于指向内存空间:
char *str2 = "abcde";
004114CB mov dword ptr [ebp-1Ch],offset string "abcde" (415758h)
二、sizeof运算
1、sizeof运算于数组,结果是数组大小,sizeof(str1) == 6;
2、sizeof运算于指针,结果是地址大小,sizeof(str2) == 4;
3、sizeof运算于引用,结果是引用对象大小;
4、sizeof运算于常量字符串,相当于运算于数组;
三、数组退化
void func1(char *param1); sizeof(param1) == 4
void func2(char param2[]); sizeof(param2) == 4
以上两个申明完全等价,传递数组参数时,数组将退化为指针。
四、resize和reserve函数原理
vector模板类有以下三个成员_Myfirst、_Mylast、_Myend:
1、_Myfirst指向内存的起始位置;
2、_Mylast指向元素的结束位置;
3、_Myend指向内存的结束位置;
4、size == _Mylast - _Myfirst,resize最终改变的是这个size;
5、capacity == _Myend - _Myfirst,reserve最终改变的是这个capacity;
resize和reserve使用:
1、频繁插入元素,可以先进行resize(初始化元素)或reserve(不初始化元素),避免频繁的内存分配和回收;
2、size远小于capacity,并且容器大小修改频率很低,使用shrink_to_fit使size==capacity节约内存;
3、代码示例:vector_resize_reserve.cpp
清理内存代码:
vec.clear();
vec.shrink_to_fit();
五、c_str和data函数区别
函数申明:
const char* c_str() const;
const char* data() const;
函数区别:
1、c_str保证字符串以零结尾;
2、data不保证字符串以零结尾;
3、c_str和data实际返回一致;