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 的方式非常简单,只需要在项目 ...
随机推荐
- 怎样用Excel自动排成绩
经常需要做表格,排成绩名次总是笨笨的一个一个填,费时又费力,终于找到了解决的办法%>_<%(不要嘲笑我了(✿◡‿◡)),原来就是一个名叫RANK的函数,还在苦逼地自己输的小伙伴们,快来看吧 ...
- HDOJ----------1009
题目: FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
- 用CSS样式画横线和竖线的方法
今天在做网页的时候,需要用到CSS画横线,虽然比较简单,但也出了一些小问题,拿来做个备忘. 方法一:用DIV,代码如下:(推荐此方法) <div style="width:80 ...
- QT类型转换(九种转换)
1.char * 与 const char *的转换 char *ch1="hello11";const char *ch2="hello22";ch2 = c ...
- Java编程思想重点笔记
首先声明转自https://github.com/lanxuezaipiao/ReadingNotes 无意中发现,写的蛮好转过来学习下. 1. Java中的多态性理解(注意与C++区分) Java中 ...
- URAL 1303
题目大意:给出N个区间[Li,Ri](1<=i<=N),一个正整数M,求N个区间里,并区间包含[0,M]的区间的最小个数(无解时输出:No solution). KB 64bit ...
- c#个性化安装包
近来想做一个模仿QQ或猎豹浏览器那样的个性化安装包,NSIS或IS等简单看了一下,比较复杂还不确定能不能实现. 想了一下,可以自己开发一个安装包程序,新建一个windows项目,但不知如何将已开发完成 ...
- struct 如何存储指针类型的值
通过 __unsafe_unretained标示符标示指针类型的值,否则xcode会报以下错误(前提,你使用的是ARC模式): ARC forbids Objective-C objects in s ...
- ARM异常---一个Uart中断的触发处理过程:
首先给出一些定义: //2440addr.inc INTOFFSET EQU 0x4a000014 ;Interruot request source offset //option.inc _ISR ...