C++是一门支持面向对象编程(object-oriented Programming)的语言,继承和多态(Polymorphic)是其最重要的特性。关于C++的继承和类内成员的各种内容在之前的文章中已经有了不少介绍,本篇文章主要是研究一下编译器对C++多态的一个实现方式:虚函数表。C++标准([IOS/IEC 14882:2014])中写道:Virtual functions support dynamic binding and object-oriented programming. A class that declares or inherits a virtual function is called a polymorphic class.注意:C++标准并没有规定如何实现多态,所以编译器对多态的实现是Implementation-defined Behavior,意思就是不同的编译器可能对多态的实现是不一样的,在不同的平台可能会无法得到相同的实验结果。
...继续阅读
(50)
因为UnrealEngine在切换关卡(OpenLevel)时会把当前关卡的所有对象全部销毁,但是常常我们需要保存某些对象到下一关卡中,今天读了一下相关的代码,本篇文章讲一下如何来实现。其实Unreal的文档是有说明的(Travelling in Multiplayer),实现起来也并不麻烦,但是UE文档的一贯风格是资料是不详细的,中文资料更是十分匮乏(多是机翻,而且版本很老),在搜索中也没有查到相关的靠谱的东西,我自己在读代码实现的过程中就随手记了一下,就当做笔记了。
...继续阅读
(51)
在C++14标准(C++98/11也一样)中,在Annex C Compatibility里有这么一条:Change: Converting void* to a pointer-to-object type requires casting12345chara[10];void* b=a;voidfoo(){char* c=b;}ISO C will accept this usage of pointer to void being assigned to a pointer to object type. C ++ will not.但是为什么operator new()会返回void*且不用显式转换为T*就能赋值给T*呢?
...继续阅读
(48)
在C++编程中比较痛恨欲绝的事莫过于:编译器瞒着程序员做了太多事。本篇文章是从C++标准([ISO/IEC 14882:2014])中整理摘录出来的关于编译器生成类的默认构造函数(default constructor)/拷贝/移动构造函数(copy/move constructor)/拷贝/移动赋值操作符(copy/move assignment operator)/析构函数(destructor)这六个特殊成员函数的几种情况以及其实际行为的文档。可以作为《Inside The C++ Object Model》的辅助资料,组合观看效果更佳(通过标准描述来理解编译器的实现)。另外,《Inside The C++ Object Model》主要是从“编译器实现”的角度来描述的,但是从“C++标准”的角度来看,书里很多是依赖于编译器实现的,就像虚函数表,标准并没有规定编译器应该用何种方式实现多态行为,自然也就不可能描述关于虚函数表的东西。还有很多对于“编译器生成”的行为在主观意识中带有歧义的理解,都可以在这里找到解答,这也是读C++标准的乐趣所在——不论好坏,标准规定不会出错,所有不符合标准描述的实现都是unstandard的。
...继续阅读
(54)
C/C++的很多资料网上数不胜数,但是经常会遇到看了一些文章资料后,我觉得作者自己都没彻底明白到底写的是什么(回头看看我以前写的文章也是,那时的眼光太片面和浅显了)。所以对于C/C++的东西我觉得还是要直接来翻标准文档才行,因为标准是不会出现歧义的。不能盲目地只是在网上搜寻并相信别人二次消化过的资料。我认为对于C/C++语言特性的知识,查阅这四份文档就足够了(点击即可在线预览或下载):ISO/IEC 9899:1999 (E)(C99标准)The C Programming language Second Edition(C语言之父Dennis Ritchie和Brian Kernighan的大作)ISO/IEC 14882:2014(E)(C++14标准)The C++ Programming Language Fourth Edition(C++之父撰写,依据C++11标准)之所以C语言标准没有依据最新的C11标准是因为目前的C++标准(C++14)的Normative references的C部分是ISO/IEC 9899:1999,使用TCPL和TC++PL可以作为C/C++标准的应用性描述,可以相互印证。更多的关于C++Normative references的内容可参照ISO/IEC 14882:2014(E)§1.2 Normative references.我会逐渐
...继续阅读
(45)