C++编译期系列

原创 2008年09月29日 00:06:00

类的虚函数:

//>-----------------------------------------------------------------------------

 很多人都知道虚函数表, 对于虚函数, 各种论坛上充斥着很多的批评:
 1. 让程序流程变得复杂;
 2. 带来的虚表, 在空间和时间上都有消耗;
 甚至有些"Niu的人"认为, 要用C完全替代C++;
 

//>-----------------------------------------------------------------------------
 先查看虚函数的实现原理: 虚函数表和函数替换; 
 >>空间:
 1. 每个类有一个虚表(简单的认为, 它像一个类的静态成员变量),
 2. 每个对象有一个保留该表的指针;
 所以主要内存消耗应该在"2"上面. 使用的时候要注意, 如果是很简单的数据结构, 少4个和8个字节是有意义的;
 如果是大类, 这个消耗是极其微小的;
 编译期间, 生成一个虚表, 并替换所有通过指针访问的虚函数(替换成虚表[idx]),  构造对象期间, 绑定虚表指针.
 
 >>执行:
 通过指针调用的虚函数, 在编译期间会被编译器默认的替代为: "虚表[idx]";
 "虚表[idx]":
 1. 它没有表索引带来的性能损耗;
 2. 执行的时候, 只是一次数组的定位访问, 然后进入函数入口;
 所以, 虚函数的额外时间使用代价, 应该跟一个"条件判断"等价, 不会有特别大的损耗;
 

//>-----------------------------------------------------------------------------
 但是虚表带来的多态是支持面向对象语言的最大特点;
 在C++以后, C#, Java都相继扩展了虚表的使用范围,
 显然, 这些语言背后的智囊都是绝顶高手, 他们在权衡了多态的利与弊之后, 还是作出了"扩展虚表"的决定.
 

//>-----------------------------------------------------------------------------
 上面提到的虚函数调用一直是"通过指针"的, 如果通过对象会怎么样呢?
 编译器会把对象直接调用的虚函数直接当非虚函数来直接替换成函数入口, 而不通过虚表, 这是高效,
 它的背后也说明了一点: 只有指针才能实现多态.

 

 

【C++泛型编程】编译期错误检测

泛型编程如果需要在各个平台上进行移植,并且保证不让移植的代码出现潜在的错误,我们需要采用编译期错误检测而不是执行期的错误检测。随着泛型编程在C++中广泛运用,更好的静态检验以及更好的可定制型错误消息的...
  • xiaoding133
  • xiaoding133
  • 2012年08月31日 18:51
  • 1138

C++编译时的类型推导

首先明确一点,VisualStudio实现的C++的类型推导是在编译时进行的。 如下代码: #include using namespace std; int main() { int ...
  • Sad_Sugar
  • Sad_Sugar
  • 2016年02月02日 00:39
  • 568

(C++)使用模板在编译期计算阶乘

在编译期计算阶乘之于模板元编程(template metaprogramming) 正如 helloword 之于初学编程。...
  • kencaber
  • kencaber
  • 2016年05月28日 17:55
  • 1286

C++ 编译期与运行期

1)常数值在编译时就确定,变量值要到运行时才确定; 2)局部变量相对于栈基址的偏移,编译时就确定,堆空间变量的相对位置也要运行时才确定; 3)静态变量在用户空间的地址【虚拟地址】编译时就确定,而非...
  • dark19940411
  • dark19940411
  • 2015年04月02日 15:01
  • 553

C++中编译期多态机制和运行期多态机制之间的区别

函数由函数名、参数个数、参数类型、返回值和调用方式等组成。 函数签名:把函数名去掉之后函数的剩余部分(参数个数、参数类型、返回值和调用方式等)。 顶层函数:在类之外声明并定义的函数称为顶层函数。 成员...
  • wangkai_123456
  • wangkai_123456
  • 2015年12月16日 15:09
  • 397

编译期常量和非编译期常量

编译期常量和非编译期常量  (2009-04-07 16:20:54) 转载▼ 标签:  杂谈 分类: 学习&技术 unsign...
  • jfkidear
  • jfkidear
  • 2013年04月02日 14:18
  • 1137

C++编译期的类型测试

编译期的类型测试 一、使用模板特化机制 如比较两个类型是否一致: VC8及以后版本支持了type traits机制: add_const Class            ...
  • wcyoot
  • wcyoot
  • 2014年06月21日 20:34
  • 1293

C++编译期系列

 构造函数中的初始化列表的内存预设值; 说到初时化列表, 大家都会从上面发现这两句话: 1. 效率更高; 2. 初始化列表初时化顺序依据类定义的顺序, 而不是依据初始化列表中的先后顺序; 在中还会发现...
  • ViCross
  • ViCross
  • 2008年09月29日 00:09
  • 499

C/C++ 使用宏在编译期计算可变参数个数

C/C++ 使用宏在编译期计算可变参数个数
  • holdsky
  • holdsky
  • 2014年09月16日 11:22
  • 1401

编译期多态和运行期多态

什么是多态所谓的多态是通过一个单一的标识符支持不同的特定行为的能力。多态的分类从绑定时间 静态多态 (编译期多态) 动态多态 (运行期多态) 从表现的形式 虚函数 重载 模板 转换 (宏定义) 今天...
  • qq_35644234
  • qq_35644234
  • 2017年05月02日 19:35
  • 280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++编译期系列
举报原因:
原因补充:

(最多只允许输入30个字)