C/C++ - 结构体实际申请的空间
C/C++ - 结构体实际申请的空间
- 如下的结构体,
sizeof()大小,实际申请的空间以及理论上申请最佳空间
struct Spot
{
int x;
int y;
bool visible;
int red;
int blue;
int green;
double alpha;
bool cleaned;
};
在分析前,要先了解下Data structure alignment概念
- 简单来说,就是因为CPU访问内存时是成块成块读取数据的,所以编译器为了让CPU访问的时候更加方便些(同时也使得程序更加高效些),会将变量的内存地址移动到2的N次幂上。而为此空出来的空间叫做padding,在计算结构体总大小的时候,也得考虑这些padding。
- 简单说,假设CPU每次读取内存都是读4个字节,那么要把变量内存地址移到4的倍数上。不过在64位系统中,CPU每次可以读取8个字节,所以8个字节的double变量地址要位于8的倍数上。一个个变量算下来,最后就会得到结构体的实际大小了。
1. 计算理论上的最佳值:
- int --> 4 Byte
- bool --> 1 Byte
- double --> 8 Byte
所以理想最佳值为:4+4+1+4+4+4+8+1 ==> 30
2.sizeof() 程序输出结果(在64位机器ubuntu上测试)输出结果
- 测试机器:ubuntu x64
- 编译器:gcc4.8.2
最终结果是:40
3.根据Data structure alignment在以下平台分析
- 测试机器:ubuntu x64
- 编译器:gcc4.8.2
因为在64位机器上运行,所以CPU每次可以读取8个字节,也就意味着每8个字节位一组数据。
int x和int y作为1组。
bool visible ---> 1 Byte
int red ---> 4 Byte
int blue ---> 4 Byte
因为visible+red ---> 5 Byte,没到8 Byte 所以后面可以在追加字段,但是visible + red + blue --> 9 Byte 超出8Byte 所以这里分成两组,visible + red 一组,blue为另外一组
依次类推:最终结果和sizeof()结果一致
后记:对于Spot结构的优化
struct Spot
{
double alpha;
int x;
int y;
int red;
int blue;
int green;
bool cleaned;
bool visible;
};
- 参考http://segmentfault.com/blog/spacewander/1190000000753849
C/C++ - 结构体实际申请的空间的更多相关文章
- C++中的结构体所占内存空间总结
因为结构体有时候需要字节对齐.一般而言,struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度. 在默认情况下,编译器为每一个变量或数据单元 ...
- 浅谈c语言结构体
对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...
- C语言回顾-结构体、枚举和文件
1.构造类型 根据已经定义的一个或多个数据类型用构造的方法来定义. 分为:数组.结构体和共用体 2.结构体 struct 结构体名{ 成员列表: }; 1)结构体定义完成以后,计算机不会给结构体分配存 ...
- 黑马程序员——C语言基础 变量类型 结构体
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)变量类型 1)局部变量 1> 定义:在函数内部定义的变量,称为 ...
- 【C语言入门教程】7.3 结构体指针的定义和引用
C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...
- (八)C语言结构体和指针
指针也可以指向一个结构体变量.定义的一般形式为: struct 结构体名 *变量名; 前面已经定义了一个结构体 stu: struct stu { char *name; int num; char ...
- C:结构体
结构体 构造类型:就是有基本的类型组成的 1.结构体 结构体是一种自定义的数据类型 和 int float 是一样的都可以定义变量 数组 只能存放一种类型的容器 结构体 可以存放多种数据类型 ...
- C#调用C++DLL传递结构体数组的终极解决方案
在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...
- 绝对好文C#调用C++DLL传递结构体数组的终极解决方案
C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文 http://blog.csdn.net/xxdddail/art ...
随机推荐
- spring的@Transactional注解详细用法
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...
- discuz使用总结
使用xampp作为运行环境 xampp的初始目录. xampp中mysql root账户的密码是空
- 浙大 pat 1024题解
1024. Palindromic Number (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...
- Trouble Shooting
情况是这样的,我在写一个类似于Online-Judge的系统,用python很容易实现,编译源程序,运行程序,最后比较程序输出与标准输出得出成绩.现在有个问题,万一程序运行时崩溃,比如出现除0异常,a ...
- 对于Netty的十一个疑问
[说明]本文原载于码农 IO(manong.io)官方微信 developerWorks,转载.引用请注明出处及作者. 1.Netty 是什么? Netty 是一个基于 JAVA NIO 类库的异步通 ...
- CevaEclipse - 编译器attribute扩展
1.函数与变量的 Section Attribute void foobar (void) __attribute__ ((section (".CSECT mmm"))); vo ...
- HDU 1863 Kruskal求最小生成树
好久没写博客了写着玩的…… Kruskal这种东西离散都学过…… 一句话…… 添加当前图权值最小且构不成环的一条边 直到连接所有点…… 其他人好多Kruskal的模版 肯定有比我的好的…… 就是刷一波 ...
- Chapter 15_3 使用环境
创建模块的基本方法的缺点在于,忘记使用local,很容易就污染全局空间. “函数环境”是一种有趣的技术,它能够解决上面的问题.就是让模块的主程序块独占一个环境. 这样不仅它的所有函数可以共享这个tab ...
- css格式布局
一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例 : 二.position:absolute 1.外层没有position:absolute(或 ...
- 常用JS调试工具使用方法,帮你快速定位问题(Firebug+ IE“开发人员工具”)
来源: 这里花了点时间小结了下目前项目中比较合适易于上手的JS调试工具.方法.优点与不足以及一些调试相关功能要点或策略,分享给同学们,只当抛砖引玉了,欢迎大家讨论补充. 一.Firebug:如果项目可 ...