一、字节对齐

  现代计算机的内存空间是按照字节(byte)来划分的,字节对齐的意思是在给特定变量类型分配内存空间的时候,变量的内存地址是它本身变量类型大小的整数倍。比如,给int类型的变量a分配地址空间,因为int类型大小为4字节,所以它的内存地址一定也要是4的整数倍。

  即:给变量的地址(起始地址)为它自身类型大小的整数倍。

  原因:硬件、cpu存取效率
  
  内存对齐:
    在32位系统下,gcc的对齐方式为1,2,4,默认为4字节对齐。 
    在64为系统下,gcc的对齐方式为1,2,4,8,默认为8字节对齐
 
二、union大小
  1)大小足够容纳最宽的成员;
  2)大小能被其包含的所有基本数据类型的大小所整除。
  (是最大的基本类型的 能容纳最宽成员的整数倍)
  

union a
{
char a;
int b;
char c[10];
};

  大小为12 (int -4 , c[10]  - 10)

三、struct大小  等于最后一个成员的偏移量加上最后一个成员的大小

  偏移量:成员的地址与struct首地址的差,第一个成员偏移量为0

1)结构体变量中成员的偏移量必须是该成员(基本数据类型)大小的整数倍(0被认为是任何数的整数倍) 。 (不是整数倍,在当前成员前填充字节)
2)结构体大小必须是所有成员大小的整数倍。
3)如果结构体中的成员又是另外一种结构体,只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。
另:为了使内存对齐,结构体大小要是本系统内存对齐数的整数倍,如果不是,在结构体最后一个成员后填充字节,直到结构体占用的内存空间字节数是系统内存对齐数的整数倍后,才是结构体实际占用的内存空间大小。
struct v
{
double a;
short b;
char c[3];
short d;
char e;
};

 在32机上占20byte (?)  在64位上24byte。

struct r
{
double a;
short b;
short c;
char d[3];
char e;
};

 32 或 64 位上都是 16.

这两个struct中的数据类型一样,只是成员排列顺序不同,占有空间不同。
在定义结构体时,尽量将占用空间最大的数据类型成员定义在前面。
 

union 和struct大小计算的更多相关文章

  1. struct 大小计算

    结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...

  2. C语言精要总结-内存地址对齐与struct大小判断篇

    在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以 ...

  3. 【C++】结构体、联合体大小计算

    struct结构体大小计算 struct A { char a; int b; char c; } 这个结构体中,char占据1字节,int占据4字节,char占据1字节,而这组数据结构的大小是12字 ...

  4. C++类所占内存大小计算

    C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...

  5. C++类的大小计算汇总

    C++中类涉及到虚函数成员.静态成员.虚继承.多继承.空类等. 类,作为一种类型定义,是没有大小可言的. 类的大小,指的是类的对象所占的大小.因此,用sizeof对一个类型名操作,得到的是具有该类型实 ...

  6. 用union 和 struct 位域操作

    很久没有用C 语言中的 union 和 struct 位域操作了. 最近用了一下(当然,我承认是从stackoverflow 上抄的) 需求是这样的,已知一个 LPARAM 整数 3866625 ,求 ...

  7. 结构体(struct)大小

    结构体(struct)大小 本文参考链接:C语言结构体(struct)常见使用方法,链接中的实例代码经实践有几处不准确,本文在引用时已做更改 注意:在结构体定义时不能申请空间(除非是结构体变量),不可 ...

  8. Java对象的内存布局以及对象所需内存大小计算详解

    1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...

  9. (一一七)基本文件操作 -SDWebImage清除缓存 -文件夹的大小计算

    在iOS的App沙盒中,Documents和Library/Preferences都会被备份到iCloud,因此只适合放置一些记录文件,例如plist.数据库文件.缓存一般放置到Library/Cac ...

随机推荐

  1. Linux SSH 基于密钥交换的自动登录原理简介及配置说明

    协商交互过程 1.客户端向目标服务器发送登录请求.在SSH 服务启用了证书验证登录方式后,会优先通过证书验证方式进行登录验证. 2.目标服务器根据 SSH 服务配置,在用户对应目录及文件中读取到有效的 ...

  2. unittest用例执行的顺序

    unittest在执行用例(test_xxx)时,并不是按从上到下的顺序执行,有特定的顺序. 示例: import unittest class TestBdd(unittest.TestCase): ...

  3. CSS之实现垂直时间线展示相关内容效果

    如下,最近在工作中遇到实现时间线效果的需求,用纯css即可实现,下面给出详细实现代码. html: <div class="time_line_list_wrap hide" ...

  4. warning C4828问题的处理

    在QT的一些项目中,有时候会出现如下警告 warning C4828: 文件包含在偏移 0x215 处开始的字符,该字符在当前源字符集中无效(代码页 65001). (编译源文件 XXXXXXcpp) ...

  5. yii2常用查询

    两表连查 $model = Article::find()->joinWith(['type'])->select('new,t_name,article.t_id')->asArr ...

  6. 20165309 《网络对抗技术》实验一:PC平台逆向破解

    20165309 <网络对抗技术>实验一:PC平台逆向破解 目录 实践目标 基础知识 实验原理.内容及步骤 问题与解决 实验收获 一.实践目标 本次实践的对象是一个名为pwn1的linux ...

  7. 创建ajax的步骤

    第1步:创建XMLHttpRequest对象,也就是创建一个异步调用对象. 第2步:创建一个新的HTTP请求,并指定该HTTP请求的方法.URL以及验证信息. 第3步:设置响应HTTP状态变化的函数. ...

  8. 【差分约束系统】 note

    [差分约束系统] note >>>>题目 [题目描述] 最近有一款很火的游戏,叫做八分音符酱,它和马里奥很相似,不过它的跳跃距离是由你的声音大小来控制的.不过我们现在对玩法就行 ...

  9. 新手vue构建单页面应用实例

    本人写的小程序,功能还在完善中,欢迎扫一扫提出宝贵意见! 步骤: 1.使用vue-cli创建项目2.使用vue-router实现单页路由3.用vuex管理我们的数据流4.使用vue-resource请 ...

  10. 个人信息——头像更换(拍照或相册上传)~ 微信小程序

    微信小程序中 在用户信息中关于用户头像更换(拍照或相册上传)功能实现. 图像点击触发事件: <image src='{{personImage}}' bindtap='changeAvatar' ...