31 位域、空类的sizeof值
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结构体之位域(位段)
2 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值的更多相关文章
- 空类的sizeof,有一个虚函数的类的sizeof
今天面试,忽然被问到这个题目,查了一下果然有欸. #include <iostream> using namespace std; class A { }; class B { publi ...
- C++空类和string类
1. 空类 1.1 空类默认哪六个成员函数. class Empty { public: Empty(); //缺省构造函数 Empty e; Empty( const Empty& ); / ...
- sizeof 空类
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1. 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针 ...
- 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,d ...
- 转:C/C++中,空数组、空类、类中空数组的解析及其作用
转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多 ...
- C++中的空类与空结构体大小
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { }; int main() { ...
- c++空类的大小
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们 ...
- C++空类以及没有成员变量的类的大小
关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的. 我们来看如下一个例子: #include<iostream> us ...
- C/C++中的空类及抽象类大小
代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; ...
随机推荐
- 20175211 2018-2019-2 《Java程序设计》第四周学习总结
目录 教材学习内容总结 第五章 子类与继承 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 其他(感悟.思考等,可选) 学习进度条 参考资料 教材学习内容总结 第五 ...
- HttpWebRequest请求http1.1的chunked的解析问题记录
问题:我的请求获取不到URL对应的内容(换个浏览器可以). 第一步对比wirshark截包看HTTP请求头,发现我这缺失一部分请求头. 对着官方文档添加即可.https://msdn.microsof ...
- Docker:镜像构建与进入容器总结
构建镜像总结 docker构建镜像有两种方法: 1.使用docker commit + 容器 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] ...
- 给学习立个flag
今天是2018年7月7号,此时的砖相比昨天格外烫手,望着手套因被磨破而露出来的半截手指头,一股股热浪溜溜的从指间划过,背后还有小山一样高的砖头,感觉对面today店里的冰镇西瓜又成了不可奢望的梦... ...
- mybatis常见问题和错误
1. jdbc java type 映射关系 1) mysql的text 在mybatis中使用varchar类型 2. mybatis常见的错误 3.There is no getter for p ...
- Linux:command not found
最近老是遇到command not found 这个问题,然后就上网查到什么文件底下export什么变量啊.后来次数多了,发现不对劲.后来上网查了一下,原来切换到root用户要使用su -,而不是su ...
- JS设计模式(4)迭代器模式
什么是迭代器模式? 定义:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游 ...
- Spring错误——Spring AOP——org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
背景:学习切面,测试前置通知功能,xml配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- 【论文笔记】CBAM: Convolutional Block Attention Module
CBAM: Convolutional Block Attention Module 2018-09-14 21:52:42 Paper:http://openaccess.thecvf.com/co ...
- 关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)
概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等.在ComponentOne For ...