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 的方式非常简单,只需要在项目 ...
随机推荐
- SQL(Oracle)日常使用与不常使用函数的汇总
--日常使用的sql语句和oracle语句,有些相对使用的频率比较高,收藏起来还是比较值得的 -- 绝对值 SQL:) value Oracle:) value from dual -- 2.取整(大 ...
- POJ 2115 模线性方程 ax=b(mod n)
/* (x*c+a)%(2^k)==b →(x*c)%(2^k)==b-a 满足定理: 推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b. 推论2:方程ax=b(m ...
- zoj 1109 zoj 1109 Language of FatMouse(字典树)
好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...
- ES配置详解
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来 ...
- java 在方法中新建线程,传参和加锁详解
在实际开发中,往往在基本两三种创建线程的方法之外,还用到一个简单的创建线程调用方法的情况,代码如下: public void deleteRedisData(RedisKey redisKey){ n ...
- Java 网络编程(一) 网络基础知识
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951826.html 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机 ...
- memset 还可以这样用
我们经常将memset用在初始化中,其实还可以这样方便的使用它: 给数组中的一部分初始化: 看例子: #include<iostream> #include<string.h> ...
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- python 冒泡和快排,不多说【无聊】
#-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...
- 手机浏览器下IScroll中click事件
产品的h5页面几乎都使用了iscroll插件,如果a标签在iscroll里,在部分手机浏览器中会出现无法点击的情况,不管是绑定click事件还是使用a标签的href属性.href属性偶尔还会能点击,c ...