Linux进程的五个段

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。它是由操作系统分配的,内存的申请与回收都由OS管理。

成员函数虽然包含在类的声明之内,却不出现在对象中。每个非inline成员函数只会诞生一个函数实例。创建对象不会为成员函数分配空间,成员函数放在代码段,多个对象共享。

一、C++对象模型

nonstatic data members被配置于每一个class object之内,static data members则被存放在所有的class object之外。static 和nonstatic function members也被放在所有的class object之外,virtual function则以两个步骤支持之:

1.每一个class产生一堆指向virtual function的指针,放在virtual table中

2.每一个class object被添加了一个指针vptr,指向相关的virtual table,vptr的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成。

c++对象模型主要缺点是,如果应用程序代码本身未曾改变,但所用到的类对象的nonstatic数据成员有所修改,那么那些应用程序代码同样得重新编译

策略性正确的struct

把单一元素的数组放在一个struct的尾端,于是每个struct对象可以拥有可变大小的数组:

    struct mumble
{
/*stuff*/
char pc[];
};
//String是某个字符串,申请一块内存空间,大小为结构体大小加上string这种数据的大小再加一个字节作为安全区
struct mumble *pmumbl = (struct mumble*)malloc(sizeof(struct mumble) + sizeof(string)+);
//把string的数据拷贝到结构体里pc[0]为起始位置的一片区域里
strcpy(pmumbl->pc, String);

在网络传输、文件读取或其他什么特殊用途里,会用到一些特殊的结构体,这种结构体的特征是,其开始某部分的数据是固定用途,比如传输数据的大小和类型等控制命令,而后续的数据的长度和类型是变动的。
这个“变长”结构体就如问题中的(为了说明就稍加修改):

struct Hd  {
//这里放入头部信息
int type;//后面携带数据的类型
//这里就是携带的数据
char pc[];
};

而c++中凡处于同一个access section的数据,必定保证以其声明顺序出现在内存布局当中。然而被放置在多个access section中的各笔数据,排列顺序就不一定了。

二、对象的差异

表现一个class object 需要的内存:

1.其nonstatic members的总和大小

2.加上任何由于alignment的需求而填补上去的空间(将数值调整到某数的倍数)(边界调整填补上的空间)

3.加上为了支持virtual而由内部产生的任何额外负担(vptr)

结构体中每个成员的地址是该成员对齐大小的整数倍,整个结构体大小是最大成员对齐大小的整数倍

一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。指针类型用于教导编译器如何解释某个特定地址中的内存内容及其大小。

指针的类型

一个指针,不管它指向哪一种数据类型,指针本身所需的内存大小是固定的。指向不同类型之各指针间的差异,既不在其指针表示法不同,也不在其内容(代表一个地址)不同,而是在其所寻址出来的object类型不同。也就是说,指针类型会教导编译器如何解释某个特定地址中的内存内容及其大小

一个类型为void*的指针只能够持有一个地址,而不能通过它操作所指对象的原因:无类型,编译器无法得知对象所占内存大小

class bear:public zooAnimal{...}

bear b;

zooAnimal *pz=&b;

bear *pb=&b;

pz,pb都指向bear object的第一个字节,差别是:pb所涵盖的地址包括整个bear object,而pz所涵盖的地址只包含bear object中的zooAnimal subobject。所以父类指针指向派生类对象,该指针不能操作派生类中独立的数据成员。

当一个base class object被直接初始化为一个派生类对象时,派生类对象会被切割塞入较小的base type内存中,于是多态不再呈现

【深度探索c++对象模型】关于对象的更多相关文章

  1. 深度探索C++对象模型——关于对象

    引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...

  2. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  3. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  4. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  5. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  6. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  7. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  8. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  9. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  10. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

随机推荐

  1. centos7.2快速搭建LAMP平台

    #查看linux系统版本信息 cat /etc/redhat-release 以上是操作系统的所有信息,补充下内核信息参数介绍: 3.10.0-514.26.2.el7.x86_64 3表示主版本号, ...

  2. Java基础知识:集合框架

    *本文是最近学习到的知识的记录以及分享,算不上原创. *参考文献见链接. 目录 集合框架 Collection接口 Map接口 集合的工具类 这篇文章只大致回顾一下Java的总体框架. 集合框架 ht ...

  3. windows10系统下安装keras框架以theano为后端并配置gpu加速

    在安装之前,请确保你的显卡是NVIDIA的,并且是以下型号,否则不能进行gpu加速,右键我的电脑--管理--设备管理器--显示适配器.另外如果你的电脑是windows7,安装教程也是一样的,不过根据k ...

  4. js--如何判别 null undefined

    收集资料如下判断: 1.判断undefined: ? 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ a ...

  5. cf886d Restoration of string

    明确几点 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了. 不可成环,aba是非法的. #include <iostream> #include < ...

  6. [uiautomator篇][11]wifi

    package com.softwinner.network.wifi; import android.content.Context; import android.content.Intent; ...

  7. php5.3.3版本前后变化中php-v和sbin/php-fpm -v

    重装php-fpm试试,遂去http://php-fpm.org/download/想下载个新版本的php-fpm, 结果发现版本大于5.3.3的PHP内部已经集成了php-fpm,不用再另行安装了. ...

  8. bzoj1064【Noi2008】假面舞会

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol: ...

  9. 刷题总结——bzoj2243染色

    题目: 题目背景 SDOI2011 DAY1 T3 题目描述 给定一棵有 n 个节点的无根树和 m 个操作,操作有 2 类:1.将节点 a 到节点 b 路径上所有点都染成颜色 c :2.询问节点 a  ...

  10. 刷题总结——电影(ssoi)

    题目: 题目背景 SOURCE:NOIP2014-SXYZ T2 题目描述 小美去看电影,发现这个电影票很神奇,有一个编号 (x,y) 表示为第 x 排第 y 位. 小美是个聪明的女孩子,她有自己的一 ...