C++空类及没有成员变量的类的大小实例分析

 更新时间:2014年07月15日 10:45:26   投稿:shichen2014  
这篇文章主要介绍了C++空类及没有成员变量的类的大小,对于初学者更好的了解C++的指针及类的存储结构很有帮助,需要的朋友可以参考下

众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。

这里我们以如下代码为例:

#include
using namespace std;
class a {};
class b{};
class c :public a{
virtual void fun() = 0;
};
class d :public b, public c{};
int main()
{
cout << "sizeof(a)" << sizeof(a) << endl;
cout << "sizeof(b)" << sizeof(b) << endl;
cout << "sizeof(c)" << sizeof(c) << endl;
cout << "sizeof(d)" << sizeof(d) << endl;
getchar();
return 0;
}

程序执行的输出结果为:

sizeof(a)=1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=8

为什么会出现这种结果呢?初学者肯定会对此疑惑不解,类a,b明明是空类,它的大小应该为为0,为什么编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以a,b的大小为1。

而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数表的指针(vptr,有多个虚函数仍然是只有一个指针),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4

类d的大小更是会让很多的初学者疑惑,类d是由类b,c派生而来的,它的大小应该为二者之和5,为什么却是8呢?这是因为为了提高实例在内存中的存取效率,内存中会有数据对齐,于是类的大小往往被调整到4字节的整数倍。并采取就近的法则,往大的方向取最近的倍数,就是该类的大小,所以类d的大小为8个字节(假如d由3个空类和c派生而来,仍然是8)。

相关文章

  • C++标准模板库STL深入讲解

    C++标准模板库STL深入讲解

    STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干个值。STL容器是同质的,即存储的值的类型相同:算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的处方
    2022-12-12
  • C语言调用SQLite数据库实现数据增删改查

    C语言调用SQLite数据库实现数据增删改查

    SQLite是一种轻量级的关系型数据库管理系统,是一个开源的、零配置的、服务器端的、自包含的、零管理的、事务性的SQL数据库引擎,本文主要介绍了如何调用SQLite数据库实现数据增删改查,需要的可以参考一下
    2023-08-08
  • C语言通过深度优先搜索来解电梯问题和N皇后问题的示例

    C语言通过深度优先搜索来解电梯问题和N皇后问题的示例

    深度优先搜索即是对一个新发现的节点上如果还关联未探测到的边,就沿此边探测下去,直到发现从原点可达的所有点为止,这里我们就来展示C语言通过深度优先搜索来解电梯问题和N皇后问题的示例
    2016-06-06
  • C++ TensorflowLite模型验证的过程详解

    C++ TensorflowLite模型验证的过程详解

    这篇文章给大家介绍了C++ TensorflowLite模型验证的过程,测试代码,主要是RunInference()和read_file(),详细操作过程跟随小编一起看看吧
    2021-08-08
  • C++如何将字符串颠倒输出

    C++如何将字符串颠倒输出

    这篇文章主要介绍了C++如何将字符串颠倒输出,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++共享智能指针shared_ptr的实现

    C++共享智能指针shared_ptr的实现

    在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露,解决这个问题最有效的方法是使用智能指针,本文主要介绍了C++共享智能指针shared_ptr的实现,感兴趣的可以了解一下
    2023-12-12
  • C++双向链表实现简单通讯录

    C++双向链表实现简单通讯录

    这篇文章主要为大家详细介绍了C++双向链表实现简单通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Qt一个进程运行另一个进程的实现方法

    Qt一个进程运行另一个进程的实现方法

    本文主要介绍了Qt一个进程运行另一个进程的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C++超详细讲解强制类型转换的用法

    C++超详细讲解强制类型转换的用法

    在C++语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于类型转换的,类型转换(type cast),是高级语言的一个基本语法。它被实现为一个特殊的运算符,以小括号内加上类型名来表示,接下来让我们一起来详细了解
    2022-06-06
  • C 语言中strstr函数实例详解

    C 语言中strstr函数实例详解

    这篇文章主要介绍了C 语言中strstr函数实例详解的相关资料,需要的朋友可以参考下
    2017-07-07

最新评论