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 的方式非常简单,只需要在项目 ...
随机推荐
- 【转】 一个fork的面试题
转自:一个fork的面试题 前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下.这个题是这样的: 题 ...
- php知识(第2天)
运算符 PHP中运算符一共分为9类: 赋值运算符, 算术运算符,比较运算符, 逻辑运算符, 错误抑制符, 三目运算符, 位运算符, 自操作运算符, 连接操作符 算术运算符 算术运算: 基本运算符: + ...
- app自动化的webView页面测试思路(appium工具)。
1.获取当前activity多有的handles,然后去遍历它,发现webView后切换到webView对应模式,就可以了.进一步操作webView的话用下面的方法(driver.getPageSou ...
- Codecademy学习打卡1
————————————————————————— 想学习编程,并且打算“闭门造车”式的开启我的自学生涯. 前段时间买了一门厚重的“Java从入门到精通”.或许是对代码,电脑编程环境的陌生,再加上纯小 ...
- c风格字符串函数
十一.C 风格字符串 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat( ...
- Protel99se教程二:使用protel99se原理图绘制
使用protel99se绘制原理图,首先要先设置一下显示网格这一项,这个可以根据个人习惯,并不是一定需要这样的,在prote99se的界面的View菜下,将visible Grid选中或取消,可以选择 ...
- 部署vc2008开发的程序(vcredist_x86是其中一个办法)
如果你编译了一个VC2008的默认的CRT/MFC的应用程序,如果目标部署电脑上没有安装相应的VC2008的动态库,当运行你的程序的时 个,会出现如下错误信息. 这是因为程序使用了基于VC2008 ...
- 脑波设备mindwave介绍
脑波,又称之为脑电波,是人大脑发出的电波,非常的微弱,只能通过设备来检测. 人的脑波在不同状态下,会不同,因此可以通过脑波来量化分析人的精神状态. 科学家讲脑电波分为四种,以下为详细解释(摘自百度百科 ...
- 禁止apache显示目录索引
1)修改目录配置: 复制代码 代码如下: <Directory "D:/Apache/blog.phpha.com">Options Indexes FollowSym ...
- Memcached源代码分析 - Memcached源代码分析之消息回应(3)
文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析 ...