C/C++数组、指针、引用区别 resize和reserve函数原理 c_str和data函数区别

2015-03-02 21:26:00
admin
原创 1894
摘要:C/C++数组、指针、引用区别 resize和reserve函数原理 c_str和data函数区别

一、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实际返回一致;

发表评论
评论通过审核之后才会显示。