第四章、function语意学

情况一:非静态成员函数
C++的设计准则就是非静态成员函数至少和一般的非静态函数有相同的效率,因此非静态成员函数会被改写:
举个例子:float
Point3d::magnitude3d()const {return x;}
①改写函数原型,添加一个额外的参数this到member
function中,用于提供一个存取管道,使得class object得以掉用该函数。
float Point3d::magnitude3d(const
Point3d *const this) {return
x;}如果是非const的就不要最前面的const。
②对内部的调用改为this指针来存取:
{return
this->x;}
③将成员函数重新写成一个外部函数,并且对其名称进行“mangling”处理,使它在程序中独一无二,这样重写或者重载都没问题。
注意对成员变量也会进行“mangling”处理,但是如果声明为extern
"C"则会压抑“mangling”处理。

情况二:virtual Member
Function
ptr->normal();就会转为(*ptr->vptr[0])(ptr);

情况三:静态成员函数
会被转为一般的nonmember函数调用,如ptr->normal();转化为normal_7Point3dSFV();原来可能为((Point3d
*)0)->normal();但是现在没有了。
静态成员函数由于没有this指针,所以它有下面特性:
不能直接存取class中的nonstatic
members,不能被声明为const、volatile或virtual,可以不需要类对象来调用。

2.Virtual Member Functions
虚函数会出现的可能:
继承base class声明的virtual
Functions函数实体,正确拷贝到对应的slot;
添加slot,加入自己的virtual Functions。

多重继承下的虚函数
当重新赋值时,会发生指针偏移,从而指向正确的类型。此时派生类共享基类的虚指针

虚拟继承下的虚函数
此时派生类有自己的虚指针而不共享基类的虚指针。
最好不要在一个virtual base class中声明nonstatic
data members,如果这样做会距离复杂的深渊越来越近。

3.函数的效能
对于函数:
void cross_product(){x=1;}
循环一百万次
for(int
i=0;i<1000000;i++)cross_product();
内联函数无论优化与否,它的效率最高。因为它把循环提到外面,只计算一次。

4.指向Member Function的指针
貌似&Point::z();都不过VS2012的编译器。。

inline 函数
没有局部变量时,它会进行相应的扩展
inline int min(int i,int j){return
i<j?i:j;}
如果调用:
int
minval,val1=1024,val2=2048;
minval=min(val1,val2);//直接扩展为minval=val1<val2:val1:val2;
minval=min(1024,2048);//直接扩展为minval=1024;
minval=min(foo(),bar()+1);//扩展为int
t1;int t2;minval=(t1=foo()),(t2=bar()+1),t1<t2?t1:t2;

有局部变量时:
inline int min(int i,int j){int minval=i<j?i:j; return
minval;}
调用时,minval=min(val1,val2);
扩展
int
__min_lv_minval;
minval=(__min_lv_minval=val1<val2?val1:val2,__min_lv_minval)
有几个局部变量就要扩展出几个局部变量

时间: 2024-10-22 21:16:44

第四章、function语意学的相关文章

第 4 章 Function语意学

1.Member Funcition的各种调用方式 Nonstatic member funcion: 编译器将其转为nonmember  Function的形式,转化步骤是: (1)添加额外的参数 ---- this指针 (2)对每一个nonstatic data member的存取由this指针操作.(this指针提供了一个存取管道) (3)对函数名进行 mangling处理,使它在程序中成为独一无二的名词. Virtual member function: 编译器将其转为nonstatic

C++对象模型——Member的各种调用方式(第四章)

第四章 Function语意学 (The Semantics of Function) 如果有一个Point3d的指针和对象: Point3d obj; Point3d *ptr = &obj; 当这样做: obj.normalize(); ptr->normalize(); 时,会发生什么事情呢?其中的Point3d::normalize()定义如下: Point3d Point3d::normalize() const { register float mag = magnitude()

【深度探索C++对象模型】第二章 构造函数语意学(上)

第二章 构造函数语意学(The Semantics of Constructors) -- 本书作者:Stanley B.Lippman 一.前言 首先让我们来梳理一个概念: 默认构造函数(Default Constructor) : 是在没有显示提供初始化式时调用的构造函数.它由不带任何参数的构造函数,或是为所有形参提供默认实参的构造函数定义.如果定义的某个类的成员变量没有提供显示的初始化式时,就会调用默认构造函数(Default Contructor). 如果用户的类里面,没有显示的定义任何

深度探索C++对象模型 第二章构造函数语意学

在使用C++时,常常会好奇或者抱怨,编译器为我们做了什么事呢? 为什么构造函数没有为我初始化呢?为什么我还要写默认构造函数呢? 2.1 Default Constructor 的构造操作 如果没有声明默认构造函数,编译器会在需要的时候帮我们产生出来. 为了避免在多个地方被需要导致重复,则编译器将产生的构造函数声明为inline方式. class Foo {public:Foo(), Foo(int) }; class Bar {public: Foo foo;char *str;} Bar ba

第四章—变量,作用域和内存问题(二)

第四章-变量,作用域和内存问题(二) JS没有块级作用域 js没有块级作用域,这个概念容易导致误解,这里就区分下几个情况,大家好好参考下: 我们知道,在其他类C的语言中,由花挂号封闭的代码块都有自己的作用域.但是在JS中,却没有块级作用域: 这里if(true){}代表条件永真,永远执行这条.if(false){}的话就是永远不执行这条. 这个代码执行之后,在if语句定义的变量,在if语句外可以访问的到.在if语句中的变量声明会将变量添加到当前的执行环境中(这里是全局环境). 还有如下的两个例子

JavaScript高级程序设计:第十四章

第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继承了HTMLElement,因而与其他HTML元素具有相同的默认属性.不过,HTMLFormElement也有它自己下列独有的属性和方法. 取得<form>元素的引用方式有好几种.其中最常见的方式就是将它看成与其他元素一样,并为其添加id特性,然后再像下面这样使用getElementById()方

【Oracle】第四章异常处理

第四章异常处理 PL/SQL 块是构成 PL/SQL 程序的基本单元 将逻辑上相关的声明和语句组合在一起 PL/SQL 分为三个部分,声明部分.可执行部分和异常处理部分 [DECLARE declarations] BEGIN executable statements [EXCEPTION handlers] END; 以下示例演示了如何使用PL/SQL 语句: declare area integer; width integer; height integer; currentdate d

锋利的jQuery第四章:jQuery中的事件和动画

第一部分 1, (1)$()是$(document)的简写,默认参数是document. $(function(){}是$(document).ready(function(){})的简写. 2, (1)事件绑定 bind(type [,data],fn); type是事件类型,有blur,focus,load,resize,scroll,unload,click,dbclick,mousedown,mouseup, mouseover,mousemove,mouseout,mouseenter

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

第四章:4.2MySQL 权限系统介绍

4.2.1 权限系统简介 MySQL 的权限系统在实现上比较简单,相关权限信息主要存储在几个被称为granttables 的系统表中,即: mysql.User,mysql.db,mysql.Host,mysql.table_priv 和mysql.column_priv.由于权限信息数据量比较小,而且访问又非常频繁,所以Mysql 在启动的时候,就会将所有的权限信息都Load 到内存中保存在几个特定的结构中.所以才有我们每次手工修改了权限相关的表之后,都需要执行"FLUSH PRIVILEGE