1 分析下列程序:

#include<iostream>
using namespace std;
struct s
{
int x: 3;
int y: 4;
int z: 5;
double a;
};
int main() {
cout<<sizeof(s)<<endl;
return 0;
}

  求sizeof(s)的结果为 16.

分析:看清楚结构体中是位操作,三个变量共占用一个int 类型的大小,int 类型占用4个字节,double占用8个字节,为实现内存对齐,int类型需要填充4个字节的长度。

x,y,z分别占用3,4,5位,int是4个字节32位,相当于xyz占用4个字节,double占8个字节,按照对齐原则,前面补4位,4+4+8=16.有一个条件是默认8字节对齐,如果前面加上一句#pragma pack(4)//设定为4字节对齐,结果就是12.

C结构体之位域(位段)

windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为:1、

#include<iostream>
using namespace std;
class A
{
};
int main() {
cout<<sizeof(A)<<endl;
return 0;
}

分析:C++对空类或者空结构体,对其sizeof操作时候,默认都是1个字节。如果类为空,结果是1.

#include<iostream>
using namespace std;
class A
{
char b[0];
};
int main() {
cout<<sizeof(A)<<endl;
return 0;
}

 如果在类中定义了变量,那就是变量size,char b[0]长为0,所以大小为0

类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二地址。同样空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就会有独一无二地址。所以空类的sizeof为1,而不是0.多重继承的空类大小也是1.

 

 

C++学习(13)

31 位域、空类的sizeof值的更多相关文章

  1. 空类的sizeof,有一个虚函数的类的sizeof

    今天面试,忽然被问到这个题目,查了一下果然有欸. #include <iostream> using namespace std; class A { }; class B { publi ...

  2. C++空类和string类

    1. 空类 1.1 空类默认哪六个成员函数. class Empty { public: Empty(); //缺省构造函数 Empty e; Empty( const Empty& ); / ...

  3. sizeof 空类

    C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1. 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针 ...

  4. 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类

    一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,d ...

  5. 转:C/C++中,空数组、空类、类中空数组的解析及其作用

    转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多 ...

  6. C++中的空类与空结构体大小

    今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { }; int main() { ...

  7. c++空类的大小

    初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们 ...

  8. C++空类以及没有成员变量的类的大小

    关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的. 我们来看如下一个例子: #include<iostream> us ...

  9. C/C++中的空类及抽象类大小

    代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; ...

随机推荐

  1. 四、UI开发之核心基础——约束(实用)

    概述 本节将会介绍最常用的几种约束,基本可以满足90%以上的UI布局要求. 先附上一份其他优秀博客https://blog.csdn.net/companion_1314/article/detail ...

  2. Substrate 使用

    1.安装 首先安装sdk,按官网教程http://www.cydiasubstrate.com/id/73e45fe5-4525-4de7-ac14-6016652cc1b8/ http://asdk ...

  3. 第四章 jQuery节点操作

    1.DOM操作分为三类:(1)DOM Core:任何一种支持DOM的编程语言都可以使用用它如:getElementById()(2)HTML-DOM:用于处理HTML文档,如document,form ...

  4. consul 集群

    主机运行 : consul agent -server -bootstrap-expect 2  -data-dir D:\consul  -node=winyh -bind=192.168.10.1 ...

  5. 51Nod 1085 背包问题 (01背包)

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. 收起   输入 第1行,2个 ...

  6. CentOS6.5系统,mysql数据库的安装

    1.查看数据库中已安装的版本: [mdata@bogon ~]$ yum list installed|grep mysqlmysql-libs.x86_64 5.1.71-1.el6 @anacon ...

  7. Appium+python自动化1-环境搭建(上)

    前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.小编擅长Python,所以接下来的教程是appium+py ...

  8. Centos7 升级 Ruby

    Centos7通过yum 安装的Ruby 是2.0版本.版本较低,需要升级到2.5以上版本. #yum 安装ruby yum install ruby #查看ruby版本 ruby -v 以下开始升级 ...

  9. Docker Kubernetes 健康检查

    Docker Kubernetes 健康检查 提供Probe探测机制,有以下两种类型: livenessProbe:如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否重启. readines ...

  10. C语言求n的阶乘(n!)

    从键盘输入一个数,求出这个数的阶乘,即 n!. 算法思想 首先要清楚阶乘定义,所谓 n 的阶乘,就是从 1 开始乘以比前一个数大 1 的数,一直乘到 n,用公式表示就是:1×2×3×4×…×(n-2) ...