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个字节。指向方法区的地址。那么方法区又是如何分布的呢?
面向对象的成员方法又是如何实现,如何布局的呢?
分享到:
相关推荐
4. 在C++中,可以将struct作为类来使用,包含成员函数和虚函数,同时可以有public、protected、private的访问控制,而在C语言中,struct仅用于数据结构。 关于头文件的引用,双引号""用于引用项目内的自定义头文件...
指针是C/C++编程中不可或缺的一部分,其强大的功能使得程序员能够更灵活地控制内存和数据。通过结合汇编语言的观点,我们可以更深入地理解指针是如何在底层工作的,这对于优化代码性能和避免潜在的错误至关重要。...
C++中的struct和class都是用来定义复合数据类型的机制,但它们存在一些区别。class是C++中定义类的关键字,可以用来定义模板参数,而struct不能。class默认的访问控制权限是private,而struct是public。在继承关系中...
- **访问控制**:C++中的struct可以改变访问权限,C语言不能。 - **继承**:C++允许struct继承,C语言不支持。 - **初始化**:C++允许直接初始化struct数据成员,C语言需要使用构造函数。 5. **头文件#include的...
##### 1.1.3 C++中`struct`和`class`的区别 在C++中,`struct`和`class`主要存在以下几点不同: 1. **默认访问级别**:`struct`默认成员访问级别为`public`,而`class`默认为`private`。 2. **继承方式**:在继承...
在C++中,还可以使用类(class),这是结构体的一种扩展,提供了私有(private)、保护(protected)和公有(public)的访问修饰符,允许控制成员的可见性和访问权限。类还可以包含构造函数、析构函数、拷贝构造函数...
- **输入**:通过“`cin`”和“`>>`”抽取操作符从标准输入流中获取数据。 - **输出**:通过“`cout`”和“`”插入操作符将数据发送到标准输出流。 #### 七、流与标准输入输出库 - **流**:用于实现输入输出的逻辑...
- **struct和class的区别**: 在C++中,默认访问权限不同,`struct`默认为`public`,`class`默认为`private`。 - **导入C函数的关键字**: 使用`extern "C"`导入C函数,避免名称修饰。 以上是根据文档提供的信息整理...
例如,使用C++标准库中的`iostream`,而不是简单的`printf`函数,会使得“Hello World”程序看起来更复杂。 8. **什么是面向对象的程序设计(OOP)?** - 面向对象编程(OOP)是一种编程范式,它使用“对象”的概念...
- **数据封装**:通过将数据和操作这些数据的方法打包到一个类(class)中来实现,增强了数据的安全性和模块化。 - **继承**:允许一个类(子类)从另一个类(父类)继承属性和行为,实现代码复用和类的层次结构。...
根据提供的文件信息,我们可以从标题、描述以及部分给出的内容中提炼出有关C++的重要知识点。 ### C++词汇表概述 C++是一种广泛使用的面向对象的编程语言,它提供了丰富的关键字和概念来支持复杂的程序设计。这份...
VC上机过程是C++语言的编译和执行过程,包括预处理、编译、汇编、链接等步骤。VC上机过程能够将C++语言的源代码转换为可执行文件,实现了C++语言的编译和执行。 C++语言的字符集 -------------- C++语言的字符集...
10. `struct`, `class`, `union`:`struct`和`class`都用于定义自定义类型,主要区别在于默认的成员访问权限(`struct`是`public`,`class`是`private`)。`union`则是一种特殊的数据结构,它允许多个数据成员共享...
### C++关键字和操作符替代名 #### 概述 在C++编程语言中,关键字是具有特定含义的预定义标识符,它们被语言保留用于构成语法结构的关键部分。此外,C++还支持一系列操作符,包括算术、比较、逻辑等类型。为了提高...
- 结构体(struct)和类(class)是创建自定义数据类型的主要方式。 - 通过定义成员变量和成员函数来封装数据和行为。 #### 四、基于对象的程序设计 - **类和对象:** - 类是具有特定属性和行为的对象模板。 - ...
- `new` 和 `delete` 专门用于C++,它们会自动调用对象的构造函数和析构函数,以确保对象的正确创建和销毁。 - `malloc` 和 `free` 是C语言的标准库函数,它们不会调用构造函数或析构函数。这意味着使用 `malloc` ...
在C++中,struct和class主要用于数据组织,但二者有所不同。struct默认的访问权限是public,而class默认是private。在继承中,struct默认采用公有继承,而class默认是私有继承。在模板参数定义时,class可以作为...
此外,还有用户自定义的数据类型,如结构体(struct)和类(class),它们是实现面向对象编程的基础。控制语句包括条件语句(if, switch)和循环语句(for, while, do-while),用于控制程序的流程。函数是代码复用的...
自定义数据类型允许程序员创建自己的复杂数据结构,如结构体(struct)和类(class),它们能封装数据和操作,实现数据隐藏和封装,这是面向对象编程的核心。 总的来说,C++程序设计涉及到的概念广泛,从基础语法到...