C++数组,链表,二叉树的内存排列是什么样的,结构体占多大内存如何计算,类占多大内存如何计算,空类的空间是多少,为什么?
C++数组是连续存储的,C++数组元素依次存放在相邻的内存地址之中,并且内存大小相同。
C++链表是离散存储的,C++链表是由节点构成的,每个节点之中存在节点的值以及指向下一个节点的指针,每个节点是动态分配的。
C++二叉树也是离散存储的,C++二叉树由节点构成,每个节点包括节点的值以及指向左子树的指针和指向右子树的指针,每个节点是动态分配的。
在C++之中的结构体大小是由结构体之中数值的内存大小决定的同时受内存对齐的影响。(内存对齐是一种提高CPU对数据访问的一种高效的方法,这样CPU就可以访问到完整的数据。将数据存储到特定的内存地址上,使得数据的起始地址是其大小的整数倍,如果不是整数倍,则会在其中添加一些填充物使其对齐使之成为整数倍)
在C++之中类的内存由类内的非静态变量的大小决定,静态变量和非静态方法以及静态方法都不对其影响(静态变量和静态方法存储在内存之中和类的内存不同,静态方法不存在this指针,只能够调用静态变量,存在于全局之中,其生命周期贯穿整个程序,非静态方法由类的所有对象共享,调用非静态方法时,隐含的this指针指向实例对象,存储在代码段,所以不占据类的内存空间)
C++之中的空类占据的空间为1,为了表示给类对象分配了内存。
对于C#之中与C++的区别:
C#之中的数组也是连续分布的,数组是引用类型,与C++类似。
C#之中的链表和二叉树也是离散分布的,链表和二叉树通常是通过类对象实现的。
C#之中结构体是值类型,大小由结构体之中的变量决定,也存在内存对齐,具体对齐方式由编译器和硬件平台决定。
C#之中的类对象是引用类型,大小包括对象头和实例对象。
C#之中的空类占据的内存大小大于1,由于其包括对象头等内容。