c++从汇编角度观看指针访问内存地址

文章讨论了在C++中,通过直接对象和指针来访问结构体成员变量的不同方式。直接对象访问是直接对内存地址进行赋值,而指针访问则涉及取指针地址、计算成员变量偏移量的过程。两种方法在汇编层面上有明显的区别,指针访问通常需要额外的步骤来定位成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1直接对象访问成员

#include<iostream>
using namespace std;
int main() {
	struct Person
	{
		int m_id;
		int m_age;
		int m_height;
		void display() {
			cout << "m_id=" << m_id << endl;
			cout << "m_age=" << m_age << endl;
			cout << "m_height=" << m_height << endl;
		};
	};
	Person person;
	person.m_id = 10;
	person.m_age = 20;
	person.m_height = 30;
	person.display();
	//Person* p = &person;
	//p->m_id = 10;
	//p->m_age = 20;
	//p->m_height = 30;
	//p->display();


	//Person* p1 = (Person*)&person.m_age;
	////p1->m_id = 10;
	//p1->m_id = 40;
	//p1->m_age = 50;
	//p1->display();
	////person.display();
	return 0;
}

对应汇编

 

解释:

显然直接每次赋值直接一步到位,0Ah即10,赋值给[ebp-14h]这个地址,[eb0-14h]==m_id的地址==Person的地址

后面的_age和_height即在0Ah+4=14h     0Ah+4+4=1Eh

[ebp-10h]==_age地址

[ebp-0Ch]==_heigh地址.

2通过指针访问成员

#include<iostream>
using namespace std;
int main() {
	struct Person
	{
		int m_id;
		int m_age;
		int m_height;
		void display() {
			cout << "m_id=" << m_id << endl;
			cout << "m_age=" << m_age << endl;
			cout << "m_height=" << m_height << endl;
		};
	};
	Person person;



	//person.m_id = 10;
	//person.m_age = 20;
	//person.m_height = 30;
	//person.display();
	Person* p = &person;
	p->m_id = 10;
	p->m_age = 20;
	p->m_height = 30;
	p->display();


	//Person* p1 = (Person*)&person.m_age;
	////p1->m_id = 10;
	//p1->m_id = 40;
	//p1->m_age = 50;
	//p1->display();
	////person.display();
	return 0;
}

对应汇编

 lea         rax,[rbp+8]  
 mov         qword ptr [rbp+38h],rax  
 mov         rax,qword ptr [rbp+38h]  
 mov         dword ptr [rax],0Ah  
 mov         rax,qword ptr [rbp+38h]  
 mov         dword ptr [rax+4],14h  
 mov         rax,qword ptr [rbp+38h]  
 mov         dword ptr [rax+8],1Eh  
 mov         rcx,qword ptr [rbp+38h]  

分析

显然每次赋值用了2句。

[rbp+8]  表示指针地址

[rbp+38h] 表示person地址==m_id地址

[rax+4]==m_id+4==_age地址

[rax+8]==m_height地址

例如1先将[rbp+8]  的地址给了rax   2 把rax里面存放的地址mov入 [rbp+38h]  

也就是说指针地址为[rax]指向person地址==m_id地址

而[rax+4]的意思就是_age地址

//原理:如何利用指针间接访问所指向对象的成员变量?

1.从指针中取出对象的地址

2.利用对象的地址+成员变量的偏移量计算出成员变量的地址

3.根据成员变量的地址访问成员变量的存储空间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值