探索C++对象存储空间

1)全局对象,全局静态对象何时创建/析构?

2016-11-17 21-31-50屏幕截图.png

全局对象在main函数调用之前被构造 全局对象存储在.data节 (本例是0x804a03c)


2016-11-17 22-34-01屏幕截图.png

观察全局对象的析构时机,析构同样需要传递this指针


2016-11-17 2屏幕截图.png

可以看到this指针的传递过程


2016-11-17 3屏幕截图.png

可以看到构造函数中,成员变量赋值的过程(***在这里不能看出是否使用了初始化列表***) 0x8(%ebp)拿出this指针,0xc(%ebp), 0x10(%ebp), 0x14(%ebp)分别拿出实参1,2,3

2)类中的静态成员变量是否占用对象的存储空间?

2016-11-17 4.png

对象中的静态成员变量和非静态成员变量存储在不同的位置上!

3)类的静态成员方法是否传递了this指针?

2016-11-17 5.png

由于没有传递this指针,导致类的静态成员方法无法修改类的非静态成员变量,此时编译报错 error: invalid use of member ‘Foo::length_’ in static member function 即使写了foo.doit,也不会传递foo首地址(就是this指针)


2016-11-17 6.png

this指针是编译器维护的一根指针,程序员也可以显式使用之
this指针在不同的对象和同一份代码之间架设了一座桥梁

4)函数中定义的静态局部对象分析

void doit() { static Foo foo(1,2,3); printf("doit\n"); }
比较带不带编译器选项的区别 -fno-threadsafe-statics

2016-11-17 22-55-50屏幕截图.png
2016-11-17 22-57-04屏幕截图.png

http://lists.apple.com/archives/darwin-drivers/2005/May/msg00066.html
http://wiki.osdev.org/C++
https://opensource.apple.com/source/libcppabi/libcppabi-14/src/cxa_guard.cxx.auto.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,156评论 0 50
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,146评论 1 51
  • const 引用 const 引用是指向 const 对象的引用:const int ival = 1024;co...
    rogerwu1228阅读 3,838评论 0 1
  • 第一天 一.内联函数(inline) 函数调用的时候需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作...
    陈果123阅读 4,806评论 0 1
  • 站在巨人的肩膀上——IDA PRO权威指南阅读笔记 一,窗口 view->open subviews 打开/关闭各...
    SueLyon阅读 14,910评论 0 6