《coredump问题原理探究》Linux x86版6.1节C++风格数据结构内存布局之无成员变量的类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/41490493

在探究完C风格数据结构内存布局之后,接着探究C++风格数据结构内存布局。

虽然最简单的类是没有任何成员变量和成员函数,但由于没什么意义,不值得探究。在这里,就先探究一下没有任何成员变量和虚函数,只有成员函数的类。

先看一下例子:

  1	 #include <stdio.h>
  2	 class xuzhina_dump_c06_s1
  3	 {
  4	     public:
  5	         void hello()
  6	         {
  7	             printf( "hello\n" );
  8	         }
  9	         void print()
 10	         {
 11	             printf( "this:%p\n", this);
 12	         }
 13	 };
 14 
 15	 int main()
 16	 {
 17	     xuzhina_dump_c06_s1 test;
 18	     printf( "address of test:%p\n", &test );
 19	     test.print();
 20	     test.hello();
 21	     return 0;
 22	 }

汇编代码:

(gdb) disassemble main

Dump of assembler code for function main:

  0x080485a0 <+0>:    push   %ebp

  0x080485a1 <+1>:    mov    %esp,%ebp

  0x080485a3 <+3>:    and    $0xfffffff0,%esp

  0x080485a6 <+6>:    sub    $0x20,%esp

  0x080485a9 <+9>:    lea    0x1f(%esp),%eax

  0x080485ad <+13>:   mov    %eax,0x4(%esp)

  0x080485b1 <+17>:   movl   $0x80486c3,(%esp)

  0x080485b8 <+24>:   call   0x8048460<printf@plt>

  0x080485bd <+29>:   lea    0x1f(%esp),%eax

  0x080485c1 <+33>:   mov    %eax,(%esp)

  0x080485c4 <+36>:   call   0x80485fa<_ZN19xuzhina_dump_c06_s15printEv>

  0x080485c9 <+41>:   lea    0x1f(%esp),%eax

  0x080485cd <+45>:   mov    %eax,(%esp)

  0x080485d0 <+48>:   call   0x80485e6<_ZN19xuzhina_dump_c06_s15helloEv>

   0x080485d5 <+53>:    mov   $0x0,%eax

  0x080485da <+58>:   jmp    0x80485e4 <main+68>

  0x080485dc <+60>:   mov    %eax,(%esp)

  0x080485df <+63>:   call   0x8048490<_Unwind_Resume@plt>

  0x080485e4 <+68>:   leave 

  0x080485e5 <+69>:   ret    

End of assembler dump.

其中这段指令

   0x080485a9 <+9>:     lea    0x1f(%esp),%eax
   0x080485ad <+13>:    mov    %eax,0x4(%esp)
   0x080485b1 <+17>:    movl   $0x80486c3,(%esp)
   0x080485b8 <+24>:    call   0x8048460 <printf@plt>

是对应

18	     printf( "address of test:%p\n", &test );

也就是说,esp+0x1f放着是this指针。

由这两段指令,

   0x080485bd <+29>:    lea    0x1f(%esp),%eax
   0x080485c1 <+33>:    mov    %eax,(%esp)
   0x080485c4 <+36>:    call   0x80485fa <_ZN19xuzhina_dump_c06_s15printEv>

   0x080485c9 <+41>:    lea    0x1f(%esp),%eax
   0x080485cd <+45>:    mov    %eax,(%esp)
   0x080485d0 <+48>:    call   0x80485e6 <_ZN19xuzhina_dump_c06_s15helloEv>

可知一个对象在调用成员函数之前,都会把this指针作为成员函数的第一个参数。也就是说,类的成员函数默认都有参数,其中第一个参数就是对象的this指针。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏noteless

[三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。

3202
来自专栏五分钟学算法

每天一算:Remove Nth Node From End of List

采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。

1193
来自专栏zingpLiu

常用七种排序的python实现

算法复杂度分为时间复杂度和空间复杂度。其中, 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。

895
来自专栏一“技”之长

JavaScript基础之四——选择与循环结构

    选择结构与循环结构是编程中处理逻辑的核心结构,JavaScript中支持if-else和switch-case选择结构,支持for,for-in,do-...

621
来自专栏书山有路勤为径

复杂的链表的深度拷贝

Copy List with Random Pointer 已知一个复杂的链表,节点中有一个指向本链表任意某个节点的碎甲指针(也可以为空),求这个链表的深度拷...

681
来自专栏C语言及其他语言

[每日一题]C语言程序设计教程(第三版)课后习题6.2

题目描述 输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。 输入 一行字符 输出 统计值 样例输入 aklsjflj123 sadf918u3...

3628
来自专栏Redis源码学习系列

Redis源码学习之压缩列表

压缩列表是列表对象、哈希对象和有序集合对象的底层实现之一。以列表对象为例,当列表节点都是比较小的整数或者比较短的字符串的时候,Redis就会选择压缩列表来做底层...

790
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - Category的本质

iOS底层原理总结 - Category的本质 面试题 Category的实现原理,以及Category为什么只能加方法不能加属性。 Category中有loa...

3776
来自专栏数据结构与算法

P3374 【模板】树状数组 1 单点修改与区间查询

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N...

2937
来自专栏专注研发

delete与delete[]的区别

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。

971

扫码关注云+社区