GeekBand C++面向对象高级编程(下) 第一周学习笔记

本周学习内容回顾

转换函数

conversion function

non-explicit-one-argument ctor

两者都用于实现对象类型转换

当conversion function和non-explicit-one-argument ctor同时存在时会引发ambiguous调用错误

而显示的explicit-one-argument cotr与conversion function共存时需要显式调用构造函数之后才可以得到期望的结果

pointer-like class

智能指针

智能指针是一个模板类,内含一根真正的指针

智能指针重载operator*()和operator->()

对于*运算符运算会消耗掉*

对于->运算符运算会将结果继续加上->

迭代器

list<Foo>::iterator ite;

*ite获得一个 Foo object

ite->method;意思是调用Foo::method()

相当于(*ite).method();

相当于(&(*ite))->method();

function-like class

functor

标准库中仿函数使用一个奇特的base_class

namespace

不同命名空间互相独立

用于解决不同部门或者不同个人之间防止出现函数重名或者全局变量重名所造成的二义性问题

class template,类模板

function template 函数模板

member template 成员模板

specialization 模板特化

partial specialization 模板偏特化

个数的偏特化

范围的偏特化

template template parameter 模板模板参数

关于C++标准库

由仿函数functors形成算法库algorithm

容器container通过迭代器iterator调用algorithm中的方法实现各种运算

C++11的三个新特性介绍

varadic templates

数量不定的模板参数

关键字...就是一个所谓的pack(包)

在varadic tempaltes中 sizeof...(args)获得参数的个数

auto

两种不可应用auto关键字的情况:

1.coder本身对变量类型并不明确

2.直接用auto声明一个变量但是并没有赋值或者初始化的过程

ranged-base for loop

语法:for(decl: coll) {statement;}


通过值传递 

for(auto elem: vec) { ...;}

按引用传递

for(auto& elem: vec) {...;}

关于reference的理解

object和其reference大小相同,地址相同(当然这是假象),另java语言中所有的变量都是reference

基于这个假象,所以reference与object相比在被调用端的写法和调用端的接口均相同

因此reference通常不用于声明变量,而是用于参数类型和返回值类型的描述

函数签名包括 函数名、参数表、以及()后面有可能存在的const关键字

复合&继承关系下的构造和析构

构造:

先调用基类的默认构造函数

然后调用component的默认构造函数

最后执行自身的构造

析构:

先析构自身

然后析构component

最后析构基类


关于作业的思考


VS2008编译器x64环境下的对象模型

Fruit对象的size32字节Apple对象的size40字节

编译器将空类size1字节只含有非虚函数的类size1字节

含有虚函数不含数据的类大小为8字节

vptrsize为8字节

对象初始地址为71FCE8

int no首地址为71FCF0

相对对象初始地址偏移量为8字节

vptr的size为8字节,占位8字节

double weight首地址为71FCF8

相对no首地址偏移量为8字节

相对对象初始地址偏移量为16字节

int型变量size为4字节,但是计算得占位8字节,故而填充量为4字节

char key首地址为71FD00

相对weight首地址偏移量为8字节

相对对象初始地址偏移量为24字节

对象总size为32字节

double型变量size为8字节,占位8字节

char型变量size为1字节

key首地址到Fruit结束之间的内存空间为8字节,故而填充量为7字节

Apple对象size40字节,基类Fruit对象为32字节

由基类继承而来的数据等同基类对象模型

Apple类自身首地址为71FD28

int size首地址为71FD48

intsize相对Apple对象首地址偏移量为32字节,等于基类Fruit所占内存空间大小

char types首地址为71FD4C

相对size首地址偏移量为4字节,等于intsize所占的内存空间大小

chartypes首地址相对Apple对象首地址偏移量为36字节,Apple大小为40字节,计算得types占位4字节,故而填充量为3字节



VS2008编译器Win32环境下的对象模型

Fruit对象的size32字节Apple对象的size40字节

编译器将空类size1字节只含有非虚函数的类size1字节

含有虚函数不含数据的类大小为4字节

vptrsize为4字节

对象初始地址为8FFC38

int no首地址为8FFC40

相对对象初始地址偏移量为8字节

vptr的size为4字节,占位8字节,故而填充量为4字节

double weight首地址为8FFC48

相对no首地址偏移量为8字节

相对对象初始地址偏移量为16字节

int型变量size为4字节,但是计算得占位8字节,故而填充量为4字节

char key首地址为8FFC50

相对weight首地址偏移量为8字节

相对对象初始地址偏移量为24字节

对象总size为32字节

double型变量size为8字节,占位8字节

char型变量size为1字节

key首地址到Fruit结束之间的内存空间为8字节,故而填充量为7字节

Apple对象size40字节,基类Fruit对象为32字节

由基类继承而来的数据等同基类对象模型

Apple类自身首地址为8FFC08

int size首地址为8FFC28

intsize相对Apple对象首地址偏移量为32字节,等于基类Fruit所占内存空间大小

char types首地址为8FFC2C

相对size首地址偏移量为4字节,等于intsize所占的内存空间大小

chartypes首地址相对Apple对象首地址偏移量为36字节,Apple大小为40字节,计算得types占位4字节,故而填充量为3字节


相同代码在GCC编译器win32环境下执行的结果如下

对于Fruit的对象模型

vptr大小为4字节

vptr到int no之间没有填充

最后的char key 占1字节后被填充至8字节

对于Apple的对象模型

基类的char key本身占据1字节然后填充至8字节

但是衍生类的int size从char key偏移量4字节位置即开始填充

衍生类的char types占据1字节然后又重新填充至8字节


可能的原因是在GCC下衍生类的对象模型会占据一部分基类本身的填充空间?

表示不是很明白...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容