C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量,
在分配内存的时候,c++对struct有一种特殊的存储机制。
看以下的測试:
一。在Windows7 32bit ,IDE为VS2010中測试
#include <iostream>
using namespace std; //结构体測试
//測试环境为Windows 32bit,IDE为VS2010 //结构体
struct structZero//长度为1,无疑问
{
char c;
};
//从以下開始,认真观察
struct structOne{//长度为8
char a;
int number;//4
};
struct structOne1//16
{
char c;
int i;
double d; };
struct structOne2//16
{
int i;
char a;
double number; };
struct structOne3//16
{
double n;
char a;
int number; };
struct structOne4//24
{
char a;
double n;
int number; };
struct structTwo{//8 输出是8,无疑问
char *a;//4
int number;//4
};
struct structThree//=12,这是为何呢?
{
char a[5];//当凝视掉这一句时,sizeof()=4=sizeof(int),无疑问
int number;//当凝视掉这一句时,sizeof()=5=sizeof(a),无疑问
};
struct structFour{//=24,无疑问
char *a[5];//4*5=20
int number;//4
}; int main()
{
cout<<"sizeof(structZero)="<<sizeof(structZero)<<endl;//1
cout<<"sizeof(structOne)="<<sizeof(structOne)<<endl;//8
cout<<"sizeof(structTwo)="<<sizeof(structTwo)<<endl;//8
cout<<"sizeof(structThree)="<<sizeof(structThree)<<endl;//12
cout<<"sizeof(structFour)="<<sizeof(structFour)<<endl;//24 //额外測试
cout<<"sizeof(structOne1)="<<sizeof(structOne1)<<endl;//16
cout<<"sizeof(structOne2)="<<sizeof(structOne2)<<endl;//16
cout<<"sizeof(structOne3)="<<sizeof(structOne3)<<endl;//16
cout<<"sizeof(structOne4)="<<sizeof(structOne4)<<endl;//24 cin.get();
return 0; }
測试结果:
为什么会这样呢?
请先看后面关于结构说明内容后再看这里的内容:
struct structOne{//长度为8
char a;//占用一个字节
int number;//先自己主动填充3个字节内容之后,然后存储number,共占用4字节
//1+3+4=8
};
struct structOne1//16
{
char c;//占用一个字节
int i;//先自己主动填充3个字节内容之后,然后存储number,共占用4字节
double d;//之前共占用8,字节,由于这时候偏移量8刚好是sizeof(double)倍数,直接存储
//1+3+4+8=16
};
struct structOne2//16
{
int i;//占用4字节
char a;//占用1字节
double number;//之前共占用5字节,还要填充3字节偏移量才是8刚好是sizeof(double)倍数
//这时候,一共占用了4+1+3+8=16字节
};
struct structOne3//16
{
double n;//占用8字节
char a;//占用1字节
int number;//这时候偏移量是9,不是sizeof(int)的倍数,因此,要先填充3个字节,偏移量为
//12之后開始存储number,共占用8+1+3+4=16字节
};
struct structOne4//24
{
char a;//占用1字节
double n;//偏移量为1,先填充7个字节,然后開始存储
int number;//这时候偏移量为16,直接存储int
//一共占用1+7+8+4=20字节,但不是sizeof(double)倍数,因此后面继续填充4字节
//一共是1+7+8+4+4=24
};
结构说明:(请先看这里的说明)
struct structOne1//16
{
char c;
int i;
double d; };
默认的对齐方式//来自百度百科
字节的对齐方式
C++ 学习笔记3,struct长度測试,struct存储时的对齐方式的更多相关文章
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- 学习使用Jmeter做压力測试(一)--压力測试基本概念
一.性能測试的概念 性能測试是通过自己主动化的測试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行測试.负载測试和压力測试都属于性能測试,两者能够结合进行. 通过负载測试, ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- Orleans[NET Core 3.1] 学习笔记(四)( 3 )监控Orleans Silo的方式 OrleansDashboard
简介 Orleans用起来的确很爽,更爽的是咱们有能监控它的工具. OrleansDashboard 这个工具是一个可视化的Silo监控工具,Silo和Grain的活跃状态一目了然,各个接口的响应速度 ...
- 大前端学习笔记整理【五】rem与px换算的计算方式
前言 这段时间的小项目中算是真正意义上使用了rem来进行移动端的页面布局,项目结束了我反思了一下之前的对于rem的使用...原来我以前对rem用法完全是在搞笑啊!!结合这次这个小项目,我觉得我也有必要 ...
- 【Hibernate学习笔记-3】在Spring下整合Hibernate时, 关于sessionFactory的类型的说明
摘要 在Spring下整合Hibernate时,关于sessionFactory的配置方式主要有两种,分别为注解配置方式,和xml配置方式,下面将对这两种配置方式进行介绍. 1. sessionFac ...
- 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化
原创文章,欢迎转载.转载请注明:关东升的博客 构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和hei ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring声明式事务管理(基于Annotation注解方式实现)
在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...
随机推荐
- 利用 squid 反向代理提高网站性能
http://www.ibm.com/developerworks/cn/linux/l-cn-squid/ http://www.squid-cache.org/ http://www.beijin ...
- 深刻理解void,void*和sizeof关键字
void的字面值是“无类型”,void*则是"无类型指针".void*可以指向任何类型的数据.void几乎只有"注释"和限制程序的作用,因为从来没有人会定义一个 ...
- HDU 5226 Tom and matrix(组合数学+Lucas定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5226 题意:给一个矩阵a,a[i][j] = C(i,j)(i>=j) or 0(i < ...
- BZOJ 1034: [ZJOI2008]泡泡堂BNB( 贪心 )
贪心...用最弱的赢最弱的,用最强的赢最强的,否则用最弱的和最强的比... (贴个官方题解:将双方的选手均按从强到弱排序,然后第一次扫描尽可能用当前剩下的选手中能赢对手当前最强选手中最弱的一个去赢得胜 ...
- Cubieboard 关闭板载led
修改script.bin 找到最后节点[led_para] 修改leds_used = 0 script.bin 一般在系统盘的第一个分区 例如nand就在/dev/nanda sdcard就在/d ...
- Sql:查看数据库表和表结构的语句
T-sql 显示表结构和字段信息的sql语句: exec sp_help tablename; ~~使用存储过程 sp_help 显示数据库包含哪些表的sql语句: use yourDBname;se ...
- Protel99se教程六:创建原理图元件库
在我们平时使用protel99se进行电路以及PCB设计的时候,系统自带的元件库和PCB封装库,只有一小部分,大部份元件的元件库以及封装库,我们都需要自己制作,使用protel99se,我们可以很容易 ...
- 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了
系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...
- HDU 3231 Box Relations
题目大意: 给定一些正方体的关系,要求一组符合这些关系的正方体坐标,如果不存在符合条件的正方体坐标,IMPOSSIBLE.(Special Judge) 实力还是太弱了,完全不会…… #include ...
- $.getJSON(url,function success(){})回调函数不起作用
有个问题好久没有解决,就是: $.getJSON(url,function success(){}) 其中的回调函数,总也不执行. 以前也做过,但那都是CTRL+C,CTRL+V,也没有细想. 目标就 ...