C++中数据对齐问题。struct、union、enum,类继承。再谈sizeof()
首先是struct,在C++中,结构体其实和class有很大的相似了。但是有一点不同的是,struct默认是public,而class中是private.
当然,struct继承等用法也是可以的。
共用体的声明方式是:

枚举的声明方式与共用体比较相似

其中a初始化为0,后面默认增1,若已经初始化,则后面再增1,比如d=6在这里。
struct长度计算

大家猜一下,s1 x;int b=sizeof(x);
他的结果会是多少呢?有人会觉得应该是1+8+4+1=14.

实际上是24.为什么会是这样呢?这个和结构体的对齐方式有很大关系。总之有两条
1、整体空间是最大成员占用字节的整数倍,比如这里最大字节占用的是double,他为8,那肯定是8,16,24...
2、内存按照结构体中的数据成员先后排序,并且当前地址应该是以当前成员所占用空间的整数倍。比如在这里double b占用的是8个字节,那么以摆字节就应该是8,16,24.而char a,只有一个字节,则前面空间自动补齐。
按照上面两点的规则,我们不难得出8+8+4+1,但是应该是8的整数倍,所以是24.
这里有必要补充一下:在Linux+gcc环境下,若最大成员是4,则整体空间只需是4的倍数即可。所以这里只需要是4的倍数,4,8,12,16,20,24..
第二点,在Linux+gcc环境下,若某成员类型所占字节数超过4,那前面已摆放空间只需要是4的倍数即可。这里double b;前面只需补齐4个即可,而不需补齐8个。
故会出现整体空间是20的情况。4+8+4+1=17.但是应该是4的倍数,则为20.
那么联合体应该是怎么样的呢?
很显然联合体取值的时候只能取其中的一个,那么,联合体就是多个成员公用一个内存空间。大家很自然的就想到了,最大那个成员所占用的空间就是联合体的空间了。
讲到了数据的对齐方式,那我们就非常有必要讲一下两种不同机器的存储方式:大端存储模式和小端存储模式。
大端存储模式:高位字节存储低地位内存中,低位字节存储高位。这里均以0x12345678为例。

小端存储模式:低位存储在高位内存中

在小端系统中,b的ASCII为多少?
union enumName {
int i;
unsigned char ch[];
};
int _tmain(int argc, _TCHAR* argv[])
{
enumName student;
student.i=0x1420;
char b=student.ch[];
}
答案应该是32
小端是低位放低位,高位放高位。则是20 14这样排放。ch[0]等于0x20.
其实我们平常使用的计算机很多都是小端存储。
Update
本来以为数据对齐的问题已经讲完,但是今天看到了一道笔试题,觉得非常有必要再说一下关于类中,继承类的数据成员对齐问题。
class A{
public:
int a;
char b;
};
class B:public A{
public:
char c;
};
我们想一下,sizeof(B)是多少呢?肯定有人觉得他应该是9或者1.
但是其实答案是12.
为什么是12呢?这里我们就要注意到类的对齐方式了。
显然B继承自A,那么B应该包括了A的数据成员,那么对于A来说大小应该是8,这个和结构体的计算方式是一致的。
特别注意第二点,子类的对齐还要考虑父类的情况,在这里表现的就是,A中最大为4,那么最后的数据大小应该是4的整数倍,4,8,12,。
这里本来应该是8+1.但需要自动补齐,因此是12.
转载请注明出处:http://www.cnblogs.com/xiaoyi115/p/3622135.html
C++中数据对齐问题。struct、union、enum,类继承。再谈sizeof()的更多相关文章
- 关于C与C++的struct,union,enum用法差异
对着代码说话: #include <stdio.h> #include <stdlib.h> struct test { int abc; }; enum _enum {A,B ...
- C++中数据对齐
大体看了看数据对齐,不知道是否正确,总结如下: struct A { char name; double dHeight; int age; }; sizeof(A) = (1+7+8+4+4) = ...
- java enum类探索
参考网址1, 参考网址2 一直对枚举有点迷惑,现在试着理解枚举. 1.首先,普通类与枚举 的区别.拿两个例子比较吧 普通类: /** * 一个普通类 * @author Administrator * ...
- 如何使用Java中的Enum类
Java1.5 中出现了枚举类型.当一个值都在一个固定的范围内变化,那就可以使用 enum 类型来定义.比如说,一周有七天,一年有四季. 没有枚举类的时候,我们用常量来定义一组范围值的: public ...
- CSAPP阅读笔记-struct, union, 数据对齐-来自第三章3.9的笔记-P183-P191
1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次 ...
- C/C++中struct/union/class内存对齐
struct/union/class内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储 ...
- enum,struct,union类型使用和长度
VC,C++ Builder和lcc三个编译器 间枚举类型enum长度的情况. 各种C编译器默认的字节对齐数不一致,要写通用的代码,经常就是使用 #pragma pack(1) ... #pragma ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...
随机推荐
- mysql数据库的日常使用
mysql管理: 首先记得你只要改了权限设置,请记得重启下mysql数据库服务. 适用环境全部是linux环境下适用了. 1.查看mysql服务是否启动 ps -aux | grep mysqld 如 ...
- C#泛型和泛型约束
一.泛型: 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. 二.泛型约束: 转自:http://ww ...
- tomcat集群和负载均衡的实现(session同步)
(一)环境说明 (1)服务器有4台,一台安装apache,三台安装tomcat (2)apache2.0.55.tomcat5.5.15.jk2.0.4.jdk1.5.6或jdk1.4.2 (3) ...
- HDU 3111 Sudoku ( Dancing Links 精确覆盖模型 )
推荐两篇学DLX的博文: http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细) http://yzmduncan.iteye.co ...
- MPSVPX 配置
MPSVPX 配置 设置主机名,IP地址,掩码,网关,DNS服务器,时区(使用WebGUI界面设置). bash-2.05b# cat svm.conf arp -d -a route flush i ...
- swipe display: none后再显示,加载内容后,滑动失效问题
只需要添加这两个属性即可: observer:true,//修改swiper自己或子元素时,自动初始化swiper observeParents:true//修改swiper的父元素时,自动初始化sw ...
- 让JS帮你决定午餐吃什么吧
最愁就是每天中午吃什么了,有空就做了个 JavaScript 轮播随机选择.会轮播预先自定义的菜单中,然后点选定的时候确定一款.代码可以查看本页源代码获得,你可以自定义修改菜单数组. 效果演示 准备选 ...
- Mysql事务隔离级
转自:http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般 ...
- c#深拷贝的一个方法
使用ef,有时候会遇到,要对一个对象进行拷贝复制,可是一般的方法,拷贝后会提示此对象的实例在上下文的 entitystate已经存在,就需要用一种拷贝.简单的拷贝只拷贝了值类型,对引用类型的拷贝需要使 ...
- [bzoj3158]千钧一发——二分图+网络流
题目 传送门 题解 很容易建立模型,如果两个点不能匹配,那么连一条边,那么问题就转化为了求一个图上的最大点权独立集. 而我们可以知道: 最大点权独立集+最小点权覆盖集=总权值. 同时最小点权覆盖在一般 ...