在C++中,一个空类的大小到底是多少呢?当你定义如下的一个类X时,你设想它的大小是多少?
class X {};
X的大小是0吗?请看下面的代码
#include <iostream>
using namespace std;
class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};
int main()
{
cout<<"size of X: "<<sizeof(X)<<endl;
cout<<"size of Y: "<<sizeof(Y)<<endl;
cout<<"size of Z: "<<sizeof(Z)<<endl;
cout<<"size of A: "<<sizeof(A)<<endl;
return 0;
}
以上代码在VC6.0的运行结果如下:
size of X: 1
size of Y: 4
size of Z: 4
size of A: 8
为什么一个空的类X会有占据1byte的内存空间呢?《Inside The C++ Object Model》给出了解释。
- 实际上一个空的类并不是空的,它有一个隐晦的1byte,那是被编译器安插进去的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址,对两个不同的object加以区分。
- 在一些编译器的实现中,类似Y和Z这种情况,它们的大小将有可能是8bytes,其中包括从X继承来的1byte,指向虚基类的指针4bytes(32位系统),即Y和Z的大小是 1+4 = 5 bytes,由于编译器对内存边界对齐的要求,5bytes实际上会被调整为 8 bytes (32位系统)。
- 在其他编译器上,这种对于空类的虚继承会有特殊的优化处理。即子类只包含一个指向虚基类的指针,占用 4bytes,而不会从虚基类中继承额外的1byte,这也是VC6处理的方式,因此,在本例中,class Y和Z的大小都是4bytes。
- class A继承了Y 和 Z的各自4bytes,因此在VC6环境下,最后的结果是4+4 = 8 bytes
分享到:
相关推荐
在C++中实现栈,我们可以利用STL(Standard Template Library)中的`stack`容器,或者自定义一个栈类来完成。 1. **栈的基本操作** - **压栈(Push)**:将元素添加到栈顶。在C++中,使用`stack.push()`函数将元素...
For example, accessors and mutators should certainly be inside a class definition. More complex inline functions may also be put in a .h file for the convenience of the implementer and callers, ...
C++ 内存布局虚继承 ---Empty virtual base class (空虚基类) C++ 中的虚拟继承是一种特殊的继承机制,它允许一个派生类从多个基类继承,而不产生钻石继承问题。虚拟继承的实现方式是在编译器的实现中,并且不同的...
《C++数据结构——栈》 栈是一种在计算机科学中广泛应用的数据结构,它遵循“先进后出”(First In Last Out, FILO)的原则。在栈中,元素的插入(压栈)和删除(弹栈)操作只允许在栈顶进行。栈的主要特点在于其...
内核中对象的分配和释放是最常见的操作之一,因此拥有一个高效的内核内存分配器至关重要。然而,在许多情况下,初始化和销毁对象的成本超过了为其分配和释放内存的成本。虽然改进分配器本身是有益的,但更有效的策略...
在PHP编程过程中,有时我们可能会遇到“Creating default object from empty value”的警告,这是一个常见的错误,尤其是在从PHP 5.3及更低版本升级到5.4及以上版本时更容易碰到。这个警告意味着你尝试对一个未定义...
标题中的"cli.rar_C++/CLI_blabla_empty"表明这是一个与C++/CLI相关的内容,C++/CLI是微软.NET框架中的一种编程语言,它扩展了标准C++,使其能够与.NET Framework的组件交互。"empty main c function"描述可能指的是...
- FIX: In "Windows ClearType" font rendering mode (OS Windows mode) the "garbage" pixels can appear from the right and from the bottom sides of the painted rectangle of the TFlexText object....
在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`<queue>`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...
Intro : This is a Class of Set whoes elements are complex Functions: (1)The Union of two Sets (overload operator +,+=) (2)The Intersection of two Sets (overload operator *,*=) (3)The Difference of ...
在这个"C++数据结构实现之Stack"的压缩包中,我们主要关注的是栈(Stack)这一基本数据结构的C++实现。 栈是一种后进先出(Last In First Out, LIFO)的数据结构,它的操作类似于一个堆叠物品的过程,新添加的元素...
自90年代末以来,随着C++标准库STL的普及以及一系列优秀书籍的出版,如《The C++ Programming Language》、《C++ Primer》等,泛型编程中的关键概念——模板(Templates)逐渐成为程序员必须掌握的一项技能。...
首先,`std::queue` 是C++标准库中的一个容器适配器,它基于其他两种容器——通常为`std::deque`或`std::list`。适配器意味着它不直接存储元素,而是通过底层容器来管理元素。在大多数情况下,`std::deque`是默认...
其强大的性能和灵活的特性使得它成为许多专业图像处理软件的首选开发语言之一。本节将介绍C++在图像处理领域的几个关键应用: 1. **图像识别**:通过模式识别技术,识别图像中的特定对象或特征。 2. **图像增强**:...
VS2008是Microsoft Visual Studio的一个版本,它提供了一个强大的开发环境,支持C++编程。 **前序遍历**: 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。在递归方法中,首先访问根节点,然后递归地遍历左子树和...
打开Android Studio,选择"Start a new Android Studio project",创建一个新的Empty Activity项目。在项目设置中,勾选"Include C++ support",然后选择C++的编译标准,如C++14。 三、编写C++代码 在项目中,...
本篇文章将探讨一个有趣的问题——车厢重排,以及如何使用C++来解决这个问题。这是一个涉及栈和队列的经典问题,它对于理解这两种数据结构的特性以及它们在实际问题中的应用具有重要意义。 车厢重排问题描述如下:...