C++空类的大小

https://blog.csdn.net/lihao21/article/details/47973609

本文中所说是C++的空类是指这个类不带任何数据,即类中没有非静态(non-static)数据成员变量,没有虚函数(virtual function),也没有虚基类(virtual base class)。 
直观地看,空类对象不使用任何空间,因为没有任何隶属对象的数据需要存储。然而,C++标准规定,凡是一个独立的(非附属)对象都必须具有非零大小。换句话说,

C++空类的大小不为0

为了验证这个结论,可以先来看测试程序的输出。

#include <iostream>
using namespace std;class NoMembers
{
};int main()
{NoMembers n;  // Object of type NoMembers.cout << "The size of an object of empty class is: "<< sizeof(n) << endl;
}

输出:

The size of an object of empty class is: 1

C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址。这是由于:

  • new需要分配不同的内存地址,不能分配内存大小为0的空间
  • 避免除以 sizeof(T)时得到除以0错误

故使用一个字节来区分空类。

值得注意的是,这并不代表一个空的基类也需要加一个字节到子类中去。这种情况下,空类并不是独立的,它附属于子类。子类继承空类后,子类如果有自己的数据成员,而空基类的一个字节并不会加到子类中去。例如,

class Empty {};
struct D : public Empty {int a;};

sizeof(D)为4。

再来看另一种情况,一个类包含一个空类对象数据成员。

class Empty {};
class HoldsAnInt {int x;Empty e;
};

在大多数编译器中,你会发现 sizeof(HoldsAnInt) 输出为8。这是由于,Empty类的大小虽然为1,然而为了内存对齐,编译器会为HoldsAnInt额外加上一些字节,使得HoldsAnInt被放大到足够又可以存放一个int。

参考资料 
1. http://www.stroustrup.com/bs_faq2.html#sizeof-empty 
2. https://msdn.microsoft.com/en-us/library/f42z47h2.aspx 
3. http://en.cppreference.com/w/cpp/language/sizeof 
4. Effective C++, Third Edition, Scott Meyers著, 侯捷译

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux探秘之用户态与内核态

https://www.cnblogs.com/bakari/p/5520860.html 一、 Unix/Linux的体系架构 如上图所示&#xff0c;从宏观上来看&#xff0c;Linux操作系统的体系架构分为用户态和内核态&#xff08;或者用户空间和内核&#xff09;。内核从本质上看是一种软件——控制计算机的硬件资源&…

哈夫曼算法证明+哈夫曼编码译码程序实现

哈夫曼算法证明 哈夫曼算法是一种贪心算法&#xff0c;我们考虑证明其最优子结构和贪心选择性质&#xff1a; 最优子结构&#xff1a;假设一个树是哈夫曼树&#xff0c;则以其任意节点为根节点的最大子树也是哈夫曼树。 证明&#xff1a;子树的根节点的值是其所有叶子节点出现…

Python3小知识

对于迭代器对象&#xff0c;Python默认赋值是将引用赋值&#xff0c;即指向同一片内存空间。为了实现对内存空间的赋值&#xff0c;我们可以使用分片进行深复制。例如&#xff1a; 当定义元组的时候&#xff0c;我们一般使用小括号将元素包围起来&#xff0c;也可以不使用括号…

汇编:实现日历星期数查询工具

编制一个简单日历查询工具&#xff0c;输入年、月、日&#xff0c;能够判断当日的星期数&#xff0c;并进行输出&#xff0c;数据的输入和结果的输出要有必要的提示&#xff0c;且提示独占一行。 查阅资料 ​ 经过查阅资料&#xff0c;发现有两个相关的算法可以解决这个问题&…

一个通用纯C队列的实现

https://blog.csdn.net/kxcfzyk/article/details/31728179 队列并不是很复杂的数据结构&#xff0c;但是非常实用&#xff0c;这里实现一个队列是因为在我的另一篇博客非常精简的Linux线程池实现中要用到。 队列API定义如下&#xff1a; //queue.h #ifndef QUEUE_H_INCLUDED…

Dijkstra算法介绍+正确性证明+性能分析

算法介绍 源点s,数组d[u]表示s到u的最短距离&#xff0c;空集S&#xff0c;点集Q初始化&#xff1a;将源点s从点集中去掉&#xff0c;加入S&#xff0c;d[s]0&#xff0c;∀v∈Q,d[v]w[s][v]\forall v\in Q ,d[v]w[s][v]∀v∈Q,d[v]w[s][v]将Q中d[v]最小的点去掉加入S,并对u∈…

Linux C 实现一个简单的线程池

https://www.cnblogs.com/GyForever1004/p/9185240.html 线程池的定义 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小&#xff0c;以默认的优先级…

斐波那契数列求解+尾递归

1.普通递归 这里观察f[4]的递归树代替f[10]的递归树&#xff08;后者比较大&#xff0c;画不下&#xff09;。 使用递归求解的时候复杂度为T(n)T(n−1)T(n−2)T(n)T(n-1)T(n-2)T(n)T(n−1)T(n−2)&#xff0c;观察递归树&#xff0c;发现降速最快的是最右边每次减2&#xff0c…

循环服务器,并发服务器模型以及I/O多路转接模型

https://blog.csdn.net/xinianbuxiu/article/details/53455784 一、基于TCP/IP协议的基本循环服务器 tcp_server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #incl…

c++继承父类的子类,如何调用父类的同名函数?

https://blog.csdn.net/qq_26399665/article/details/52080215 子类调用父类的同名函数&#xff1a; 子类和父类返回值参数相同&#xff0c;函数名相同&#xff0c;有virtual关键字&#xff0c;则由对象的类型决定调用哪个函数。 子类和父类只要函数名相同&#xff0c;没有vi…

LCS最长公共子串

问题介绍 LCS问题(longest common subsequence problem)指的是求解两个字符串最长公共子序列问题。这里的子序列是可以不连续的。LCS问题广泛地出现在计算生物学中&#xff08;DNA序列、系统生成树等等&#xff09;。这里介绍如何解决LCS问题&#xff0c;以及算法的正确性证明…

将字符串中的空格用%20替换

如果不需要原地操作&#xff0c;则一遍遍历&#xff0c;将非空串复制&#xff0c;遇到空格加上%20&#xff0c;如果需要原地操作&#xff0c;首先进行遍历出空格的个数x,然后扩容2x,从后往前遍历实现。如果非空格字符串比空格字符串多的多的时候而且字符串非常长的时候使用原地…

12步轻松搞定python装饰器

http://python.jobbole.com/81683/ 呵呵&#xff01;作为一名教python的老师&#xff0c;我发现学生们基本上一开始很难搞定python的装饰器&#xff0c;也许因为装饰器确实很难懂。搞定装饰器需要你了解一些函数式编程的概念&#xff0c;当然还有理解在python中定义和调用函数…

操作系统【六】虚拟内存

传统存储管理方式的不足 一次性&#xff1a;作业必须一次性全部装入内存后才能开始运行。这会造成&#xff1a;当作也很大时不能全部装入内存&#xff1b;当大量作业要求运行时&#xff0c;由于内存无法容纳所有作业&#xff0c;因此只有少量作业能够运行&#xff0c;导致多道…

python装饰器详解

https://blog.csdn.net/xiangxianghehe/article/details/77170585 你会Python嘛&#xff1f; 我会&#xff01; 那你给我讲下Python装饰器吧&#xff01; Python装饰器啊&#xff1f;我没用过哎 以上是我一个哥们面试时候发生的真实对白。 ———————————————-分…

SQL Server【一】简介和基本概念和命令

数据结构和数据库的区别 数据库是应用软件级别研究数据的存储和操作&#xff08;主要针对磁盘上的数据&#xff09; 数据结构是在系统软件级别研究数据的存储和操作&#xff08;主要是针对内存中的数据&#xff09; 对硬盘数操作是数据库的强项&#xff0c;是数据库研究的核心…

SQL Server【二】单表查询

查询 计算列 select * from emp; -- *通配符&#xff0c;表示所有的字段 -- from emp 从emp表查询select empno, ename from emp; select ename as "员工姓名", sal*12 as "年薪" from emp;-- as可以省略&#xff0c;用于设置字段名 -- 注意用双引号将字…

SQL Server【三】连接查询

将两个表或者两个以上的表以一定的连接条件连接起来&#xff0c;从中检索出满足条件的数据。 内连接 使用inner join&#xff0c;inner可以省略 -- 查询员工的姓名和部门名称 select "E".ename as "员工姓名", "D".dname as "部门名称&q…

Linux下网络socket编程——实现服务器(select)与多个客户端通信

一、关于socket通信 服务器端工作流程&#xff1a; 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定调用listen()函数监听socket() 函数创建的套接字&#xff0c;等待客户端连接 当客户端请求到来之后调用 accept()函数接受连接请求&#xff0c…

SQL Server【四】

identity 主键自动增长&#xff0c;用户不需要为identity修饰的主键赋值 create table student (std_id int primary key identity(10,5),--(10,5)可以省略&#xff0c;默认为(1,1)std_name nvarchar(200) not null ) select * from student insert into student values (张三…