?一 ? 使用场景
- 指向的对象延时new
- 指向的对象运行时动态释放和分配
二??? 遇到的现象及原因
2.1 关键字含义
- ?int * const &rpa??? ??????????????????????? 表明rpa本身不能在赋值int* 类型,但是可以使用*rpa做左值
- const int * const &crpa????????? ? ? ? 表明crpa本身不能在赋值int* 类型,且不可以使用*crpa做左值
2.2? 目标需求【既不能修改本身的值也不能修改指向对象的值】
2.3? 实践操作问题
/*
* rpa 和 crpa同时初始化为pa,rpa的地址为&a,crpa的地址为&a
*/
int a = 10;
int *pa = &a;
int * const &rpa = pa;
const int * const &crpa = pa;
cout<<"a:"<<a<<"\t"<<*pa<<"\t"<<*rpa<<"\t"<<*crpa<<endl;
// 10 10 10 10
cout<<"a1:"<<&a<<"\t"<<pa<<"\t"<<rpa<<"\t"<<crpa<<endl;
// 0x9afe0c 0x9afe0c 0x9afe0c 0x9afe0c
/*
*然后pa进行重新赋值指向b
*结果rpa的地址为&b【符合预期,满足部分目标需求】
*但crpa的地址还是&a【不符合预期,与目标需求不符合】
*/
int b = 20;
pa = &b;
cout<<"b:"<<a<<"\t"<<b<<"\t"<<*pa<<"\t"<<*rpa<<"\t"<<*crpa<<endl;
// 10 20 20 20 10
cout<<"b1:"<<&a<<"\t"<<&b<<"\t"<<pa<<"\t"<<rpa<<"\t"<<crpa<<endl;
// 0x9afe0c 0x9afdfc 0x9afdfc 0x9afdfc 0x9afe0c
?
2.4.1 gcc-9.4及之前
结论:const int * const &crpa指向的是开始初始化的地址,编译器使用临时变量进行保存.
test():
push rbp
mov rbp, rsp //栈寄存器
mov DWORD PTR [rbp-28], 10 //[rbp-28]==a; a = 10
lea rax, [rbp-28] //lea 取[rbp-28]的地址赋值给 rax
mov QWORD PTR [rbp-40], rax //[rbp-40]==pa; pa = &a;
lea rax, [rbp-40] //lea 取[rbp-40]的地址
mov QWORD PTR [rbp-8], rax //[rbp-8]==rpa; rpa=&pa
mov rax, QWORD PTR [rbp-40] //rax 赋值[rbp-40]的值,即rax=pa=&a
mov QWORD PTR [rbp-24], rax //[rbp-24]==pa; [rbp-24] = &a;
lea rax, [rbp-24] //lea 取[rbp-24]的地址
mov QWORD PTR [rbp-16], rax //[rbp-16]=&[rbp-24]; crpa=&[rbp-24]=->&a
mov DWORD PTR [rbp-44], 20 //b = 20
lea rax, [rbp-44]
mov QWORD PTR [rbp-40], rax //pa = &b
nop
pop rbp
ret
?
2.4.2 gcc-10.1及之后
结论:const int * const &crpa指向的是pa的地址,所以可以实时获取
test():
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], 10 //[rbp-20]==a; a = 10
lea rax, [rbp-20] //lea 取[rbp-20]的地址赋值给 rax
mov QWORD PTR [rbp-32], rax //[rbp-32]==pa; pa = &a;
lea rax, [rbp-32] //lea 取[rbp-32]的地址
mov QWORD PTR [rbp-8], rax //[rbp-8]==rpa; rpa=&pa
lea rax, [rbp-32] //lea 取[rbp-32]的地址
mov QWORD PTR [rbp-16], rax //[rbp-16]==rpa; rpa=&pa
mov DWORD PTR [rbp-36], 20 //b = 20
lea rax, [rbp-36]
mov QWORD PTR [rbp-32], rax //pa = &b
nop
pop rbp
ret
?
|