How `new’ operator works ?
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=15
February 15, 2013
How `new’ operator works ?
(original works by Peixu Zhu)
For single inherited classes
1. in case of single instance of a class without virtual method (inherited or not).
- suppose the class is `theClass‘.
- at first, it calls function `malloc‘ to allocate sizeof(theClass) memory, the size is always the same to POD structures.
- if the `malloc‘ function fails, throw exception if `nothrow‘ is not specified.
- if the `malloc‘ function success, call class initializer and internal initializer to set default values of members( to be zeros)
- call the constructor on the instance as a chain, the most rooted constructor is called at first, and then the derived constructors, the latest is theClass‘s constructor.
- set return value to be the address of `malloc‘ returned.
2. in case of single instance of a class with virtual method (inherited or not).
- at first, it calls functon `malloc‘ to allocate sizeof(theClass) sized memory, for single inherited class, sizeof(theClass) = (sizeof(void*) ) + sizeof(POD structure). the additional (sizeof(void*) ) sized memory is for purpose of storing virtual pointer table for the class and it’s parent classes.
- if the `malloc‘ function fails, throw exception if `nothrow‘ is not specified.
- if the `malloc‘ function success, at first, set the first (sizeof(void*) to be the class’s virtual pointer table, and then call class initializer and internal initializer to set default values of members( to be zeros) on subsequent memory.
- call the constructor on the instance as a chain, the most rooted constructor is called at first, and then derived classes’ constructors, the latest is the class’s constructor.
- set return value to be the address of `malloc‘ returned.
3. in case of arrayed instances of a class without virtual method.
- suppose n instances are required.
- calculate the size of required memory: sizeof(void*) + n * sizeof(theClass)
- call `malloc‘ to allocate memory of the size required.
- if `malloc‘ fails, throw exception if `nothrow‘ is not specified.
- if `malloc‘ success, set the first sizeof(void*) the count of instances in the array (i.e. `n’).
- for subsequent memory, each instance is initialized and constructed as above .
- set return value to be the address of `malloc‘ returned minus sizeof(void*), i.e., the address of first instance.
4. in case of arrayed instances of a class with virtual method.
- calculate the size of required memory:
sizeof(void*) + n * sizeof(theClass).
sizeof(theClass) = sizeof(void*) + sizeof(POD)
- call `malloc‘ to allocate the size required.
- if `malloc‘ fails, throw exception if `nothrow‘ is not specified.
- if `malloc‘ success, set the first sizeof(void*) the count of instances in the array (i.e. `n’).
- for subsequent memory, for each instance, set the first
sizeof(void*) memory to be the address of virtual pointer table of the
class, then initialize the members, and call constructor one by one. - set return value to be the address of `malloc‘ returned minus sizeof(void*), i.e., the address of first instance.
5. about the virtual pointer table.
- the layout of virtual pointer table:
[vdes1][vdes2](vm1)(vm2)(vm3…)[typeinfo [data of typeinfo]].
square bracketing indicates optional.
each elements are pointer to functions/methods.
vdes1 and vdes2 are virtual destructor.
vm1/vm2 … are virtual methods.
typeinfo for function `typeid‘ (std::type_info)
data of typeinfo is the data of std::type_info
- if the class is virtual, then there is typeinfo, and data of typeinfo.
- if the class has virtual desctructor, there’s vdes1 and vdes2. one is called by `delete‘ operator (free memory in function), and ther other one is called by `delete[]‘ operator (does not free memory in function).
- in runtime environment, calling virtual methods are converted into
referencing index in the virtual pointer table, the index value of each
virtual method is determined at compiling time. In derived classes, the
child class instance and parent class instance share the same index
value on same virtual method (with same mangling signature). If the
child class does not override the parent virtual method, it will set the
indexed pointer to the parent’s method, rather than of the child,
however, if the child class override the virtual method, it will be the
indexed with pointer to the child’s method.
6. about the alignment of address returned by `new/new[]’ operator.
As you know, `new‘ and `new[]‘ operator both call `malloc‘ function to allocate memory required, thus, the alignment of address returned by `new‘ or `new[]‘ is determined by the address returned by `malloc‘. `malloc‘ does not guarantee the returned address is aligned well, thus, the `new‘ and `new[]‘ also do not guarantee the returned address is aligned well, though the size of the class is aligned.
But, there’s alignment version of `malloc‘, like posix_memalign, or valloc, etc., how about alignment version of `new‘ and `new[]‘ ? The replacement new operator in C++11 may solve the problem.
For classes with multiple parent classes.
1. each parent class has an instance in the derived class instance, sequenced as the class definition.
2. the derived class’s own members are placed at the tail of the allocated memory.
3. sizeof(theClass) = sizeof(parentClass) * (count of parent classes) + sizeof(own)
4. for plain classes without virtual methods, sizeof(own) = sizeof(POD structure), and for classes with virtual methods, sizeof(own) = sizeof(void*) + sizeof(POD structure).
How `new’ operator works ?的更多相关文章
- CLR via C# 3rd - 04 - Type Fundamentals
1. System.Object The runtime requires every type to ultimately be derived from the System.Obj ...
- Flink - Working with State
All transformations in Flink may look like functions (in the functional processing terminology), but ...
- Think Python - Chapter 11 - Dictionaries
Dictionaries A dictionary is like a list, but more general. In a list, the indices have to be intege ...
- MDX : Non Empty v/s NonEmpty
MDX : Non Empty v/s NonEmpty User Rating: / 50 PoorBest Written by Jason Thomas Friday, 07 May 20 ...
- NonEmpty和Non Empty的区别[转]
One of my favourite questions in MDX is the difference between Non Empty and NonEmpty because even t ...
- JsonPath详解
JsonPath is to JSON what XPATH is to XML, a simple way to extract parts of a given document. JsonPat ...
- C++11 : variadic templates(可变参数模板)
Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...
- ADF BC New Features
Examining ADF Business Components New Features Purpose In this tutorial, you create a series of si ...
- Dart语言特性必备了解!
学习Dart语言,必须将以下的概念熟记于心: 在dart语言中,一切皆为对象.所有的对象都是一个类的实例.甚至整数.函数.null也看做是对象.所有的对象都继承于Object类 尽管Dart是强类型语 ...
随机推荐
- html5--6-2 CSS语法
html5--6-2 CSS语法 实例 学习要点 掌握引入外部样式表方法 插入样式的三种方法 内联样式表(行内) 内部样式表(style中) 外部样式表 创建一个外部样式表 在head中使用link元 ...
- 【转载】Java中StringTokenizer类的作用
StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数.1.构造函数public StringTokenizer(String str)public String ...
- 【NOIP2017Day1T1】 小凯的疑惑
[题目链接] 点击打开链接 [算法] px + qy不能表示的最大整数为 pq - p - q 证明见这篇博客,过程很详细,推荐阅读 : https://blog.csdn.net/qwerty112 ...
- 架构:MVVC
ylbtech-架构:MVVC MVVM是Model-View-ViewModel的简写.它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻 ...
- webpack 工作方式
把你的项目当做一个整体,通过一个给定的主文件(如index.js),webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个或多个 浏览器可识别额javas ...
- 【203】利用UltraISO制作和刻录光盘映像的方法
参考:利用UltraISO制作和刻录光盘映像的方法 软件:UltraISO注册版(制作镜像).rar 目录: 1.利用UltraISO制作光盘映像2.利用UltraISO刻录光盘映像文件 1.利用Ul ...
- 安装Nginx作为文件服务器
我是在Windows上安装的,在Linux上也一样 #Windows server2008 R2 #Nginx1.12 Nginx安装包下载地址:http://nginx.org/en/downloa ...
- 洛谷 - P2598 - 狼和羊的故事 - 最大流
https://www.luogu.org/problemnew/show/P2598 第一次写这种修篱笆的题目,上次好像晓阳dalao写了一个堵人的.好像还有能改变土地属性的. #include&l ...
- 洛谷 - P1198 - 最大数 - 线段树
https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...
- bzoj4145 [AMPPZ2014]The Prices(状压dp)
Description 你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j], 求最小总费用. Input 第一行包含两个正整数n, ...