`

从汇编来看C++中struct和class的内存布局

阅读更多
struct student
{	
	char* name;
	int age;
	int  collage;
};

static void WriteAndChangeStudent(struct student data)
{
	fprintf(stdout,data.name);
	data.age = 109;
	printf("%d",data.age);
}

int main(int argc, char **argv)
{ 
	struct student* one = new student();	
	memset(one,0,sizeof(one));
	one->age = 490;
	one->name = "campolake";
	one->collage = 4;
	WriteAndChangeStudent(*one);
	return 0;
}

 

为了弄清楚各个语言的内存布局的具体情况,用一些简单的例子来测试一下。

 

第一、先看结构struct的内存结构

struct student* one = new student();

 

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)//调用了new运算符
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0) //在堆上申请内存,如果申请成功则返回。
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }

 简单struct的结构

 

	one->age = 490;
000A148F  mov         eax,dword ptr [one]  将one的地址放入eax寄存器
000A1492  mov         dword ptr [eax+4],1EAh  //第一个四字节是char指针。age 在第二个四字节上
	one->name = "campolake";
000A1499  mov         eax,dword ptr [one]  
000A149C  mov         dword ptr [eax],offset string "campolake" (0A574Ch)  //将字符串驻留池中的地址赋值
	one->collage = 4;
000A14A2  mov         eax,dword ptr [one]  
000A14A5  mov         dword ptr [eax+8],4  //collage 在第三个dword 
 

从这里看出结构式按照各个类型的大小和声明顺序来在内存中布局,给其赋值的时候按照各个变量的偏移量来操作。指针保存了其地址。

在结构中增加函数指针,看内存的变化。

 

修改结构,增加函数指针

struct student
{	
	char* name;
	int age;
	int  collage;
	void (*showme)(student* stu);
};

 给函数指针赋值,并调用。

one->showme = showmyself;
(*one->showme)(one);

 对应的汇编

	one->showme = showmyself;
0139151C  mov         eax,dword ptr [one]  
0139151F  mov         dword ptr [eax+0Ch],offset showmyself (1391154h) 

 我们看到函数指针占据结构末尾的4个字节。指向方法区的地址。那么方法区又是如何分布的呢?

面向对象的成员方法又是如何实现,如何布局的呢?

 

 

 

 

分享到:
评论

相关推荐

    C++面试八股文深度总结

    4. 在C++中,可以将struct作为类来使用,包含成员函数和虚函数,同时可以有public、protected、private的访问控制,而在C语言中,struct仅用于数据结构。 关于头文件的引用,双引号""用于引用项目内的自定义头文件...

    用汇编的眼光看C/C++之深入指针

    指针是C/C++编程中不可或缺的一部分,其强大的功能使得程序员能够更灵活地控制内存和数据。通过结合汇编语言的观点,我们可以更深入地理解指针是如何在底层工作的,这对于优化代码性能和避免潜在的错误至关重要。...

    C++八股,用于自己学习,csdn网友有需要可以自取

    C++中的struct和class都是用来定义复合数据类型的机制,但它们存在一些区别。class是C++中定义类的关键字,可以用来定义模板参数,而struct不能。class默认的访问控制权限是private,而struct是public。在继承关系中...

    C++考研复试、工作面试简答题汇总

    - **访问控制**:C++中的struct可以改变访问权限,C语言不能。 - **继承**:C++允许struct继承,C语言不支持。 - **初始化**:C++允许直接初始化struct数据成员,C语言需要使用构造函数。 5. **头文件#include的...

    C++面试--牛客(1).pdf

    ##### 1.1.3 C++中`struct`和`class`的区别 在C++中,`struct`和`class`主要存在以下几点不同: 1. **默认访问级别**:`struct`默认成员访问级别为`public`,而`class`默认为`private`。 2. **继承方式**:在继承...

    c++语言笔记

    在C++中,还可以使用类(class),这是结构体的一种扩展,提供了私有(private)、保护(protected)和公有(public)的访问修饰符,允许控制成员的可见性和访问权限。类还可以包含构造函数、析构函数、拷贝构造函数...

    C++中的关键字解析

    - **输入**:通过“`cin`”和“`>>`”抽取操作符从标准输入流中获取数据。 - **输出**:通过“`cout`”和“`”插入操作符将数据发送到标准输出流。 #### 七、流与标准输入输出库 - **流**:用于实现输入输出的逻辑...

    八股文C++篇(超级全)-c++八股文.pdf

    - **struct和class的区别**: 在C++中,默认访问权限不同,`struct`默认为`public`,`class`默认为`private`。 - **导入C函数的关键字**: 使用`extern "C"`导入C函数,避免名称修饰。 以上是根据文档提供的信息整理...

    C++常见问题解答.pdf

    例如,使用C++标准库中的`iostream`,而不是简单的`printf`函数,会使得“Hello World”程序看起来更复杂。 8. **什么是面向对象的程序设计(OOP)?** - 面向对象编程(OOP)是一种编程范式,它使用“对象”的概念...

    实用的适合c++课件

    - **数据封装**:通过将数据和操作这些数据的方法打包到一个类(class)中来实现,增强了数据的安全性和模块化。 - **继承**:允许一个类(子类)从另一个类(父类)继承属性和行为,实现代码复用和类的层次结构。...

    C++词汇表.txt

    根据提供的文件信息,我们可以从标题、描述以及部分给出的内容中提炼出有关C++的重要知识点。 ### C++词汇表概述 C++是一种广泛使用的面向对象的编程语言,它提供了丰富的关键字和概念来支持复杂的程序设计。这份...

    C++语言基础ppt课件.ppt

    VC上机过程是C++语言的编译和执行过程,包括预处理、编译、汇编、链接等步骤。VC上机过程能够将C++语言的源代码转换为可执行文件,实现了C++语言的编译和执行。 C++语言的字符集 -------------- C++语言的字符集...

    C++关键字[参考].pdf

    10. `struct`, `class`, `union`:`struct`和`class`都用于定义自定义类型,主要区别在于默认的成员访问权限(`struct`是`public`,`class`是`private`)。`union`则是一种特殊的数据结构,它允许多个数据成员共享...

    C++关键字和操作符替代名

    ### C++关键字和操作符替代名 #### 概述 在C++编程语言中,关键字是具有特定含义的预定义标识符,它们被语言保留用于构成语法结构的关键部分。此外,C++还支持一系列操作符,包括算术、比较、逻辑等类型。为了提高...

    C++程序设计(教程)谭浩强清华大学完整版

    - 结构体(struct)和类(class)是创建自定义数据类型的主要方式。 - 通过定义成员变量和成员函数来封装数据和行为。 #### 四、基于对象的程序设计 - **类和对象:** - 类是具有特定属性和行为的对象模板。 - ...

    C++面试题2

    - `new` 和 `delete` 专门用于C++,它们会自动调用对象的构造函数和析构函数,以确保对象的正确创建和销毁。 - `malloc` 和 `free` 是C语言的标准库函数,它们不会调用构造函数或析构函数。这意味着使用 `malloc` ...

    最diaoC++面试题

    在C++中,struct和class主要用于数据组织,但二者有所不同。struct默认的访问权限是public,而class默认是private。在继承中,struct默认采用公有继承,而class默认是私有继承。在模板参数定义时,class可以作为...

    c++语言基础

    此外,还有用户自定义的数据类型,如结构体(struct)和类(class),它们是实现面向对象编程的基础。控制语句包括条件语句(if, switch)和循环语句(for, while, do-while),用于控制程序的流程。函数是代码复用的...

    C++课程资料 程序设计

    自定义数据类型允许程序员创建自己的复杂数据结构,如结构体(struct)和类(class),它们能封装数据和操作,实现数据隐藏和封装,这是面向对象编程的核心。 总的来说,C++程序设计涉及到的概念广泛,从基础语法到...

Global site tag (gtag.js) - Google Analytics