最近看了一篇手机上某个前辈的文章,他描述了一下,关于在VC下面内存的分配,同一个类或者说结构体完全相同的成员,调整它们的位置竟然可以减少内存的分配。当时笔者匆忙看了一眼,大概记住了一下。回到家中打开了电脑试了一下,但是貌似那位前辈的好像有点问题。并不是全部都对。那么那位前辈是怎么说的呢?大概的意思是这样的:

操作系统分配内存的方法是按照你的定义顺序,从第2个开始,你给整个类或者方法前面的内存大小一定是新分配成员变量的内存大小的倍数。什么意思。打个比方。

V 1

class Tes{
char a;//占1个字节
int b;//占4个字节
double c;//占8个字节
};

我们应该知道char占1个字节,int占4个字节,double占8个字节。操作系统首先给Tes分配内存,看见了a,它是第1个,所以直接给Tes分配了1个字节,然后是给b分配,因为前面分配的是1,明显不是4的整数,所以系统默认给Tes的后面又多划分的3个字节(不放东西在里面),这就凑够了4个字节,刚好是b的一倍。然后是给c分配8给字节,前面a分配了1个字节加上了多于的3个字节,b也有4个字节刚好是8个字节。这样系统有分给了Tes 8个字节,共计16个字节。我们可以调整发现如果你的代码同样的内容却分配的大小不一。看代码V 2

class TesA{
int b;
double c;
char  a;
}

按照我们前面的规则,他的大小应该是 b:4+凑数: 4 + c:8+a:1=17的。同样的代码,这样就发现怎么V 2比V 1多分配了1给字节。当然一开始我没学过,回家就把代码给敲了上去,试了。发现V 2的大小比V 1确实大了,但是不是大了1而是大了8个字节。我了个乖乖。这就表明同样的代码不同的布局还真就有不同的反应啊。到底是怎么分配的呢?别急,我下面来讨论讨论。

软件环境 VC++6.0操作系统32位xp.

首先我们来变一下出现代码V 3

class TesB{
int b;
double c;
char a;
char a1;
}

当然我在V3中发现了有点怪异,我们再加点。代码V4

class TestC{
int b;
double c;
char a;
char a1;
char a2;
char a3;
char a4;
char a5;
char a6l;
char a7;
char a8;
};

在增加了这么多代码,我们在来看看Main函数

void main(){
cout<<sizeof(Tes)<<endl;
cout<<sizeof(TesA)<<endl;
cout<<sizeof(TesB)<<endl;
cout<<sizeof(TesC)<<endl;
}

他们的结果是

16
24
24
32

我们来看一下,从4个数字我们来看,首先第1个是在我们预期,后面的则不是。我们比较TesB和TesC发现,只有代码char增加了8个申请的内存才会有变化,也就是说,系统每次分配的内存不是像我们前面的前辈说的那样。编译器最后会看,你整个的类或者结构体的大小是否为其中(最长的)成员变量的最大值,如果不是,系统会自动扩充。就那V3来看本来应该是18的,但是因为18不是8的整数倍,所以就扩张到了24.

C++中对象优化的个人考究相关推荐

  1. JVM中锁优化,偏向锁、自旋锁、锁消除、锁膨胀

    本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力.而在很多 ...

  2. Java虚拟机笔记(五):JVM中对象的分代

    为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...

  3. Java中对象池的本质是什么?(实战分析版)

    简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...

  4. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的" ...

  5. 【Unity技巧】Unity中的优化技术

    写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Un ...

  6. Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  7. C语言中的优化技巧总结

    1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组 ...

  8. Oracle中的优化器--CBO和RBO

    Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的 ...

  9. 理解JVM中对象与垃圾回收机制

    目录 一.虚拟机中对象的创建过程 1.检查加载 2.分配内存 3.内存空间初始化 4.设置(主要是对象头信息) 5.对象初始化 二.对象的内存布局 三.对象的访问定位 四.判断对象存活 五.各种引用 ...

最新文章

  1. 修改一个字段中的部分内容
  2. bundle install 出现 #39;gem install mysql2 -v #39;0.3.15#39; succeeds before bunding #39;
  3. node mysql 事件循环_NodeJs 的 Event loop 事件循环机制详解
  4. window安装swagger editor
  5. Statement和PreparedStatement之间的区别(转)
  6. react学习(35)----getFieldDecorator will override value
  7. ASP.NET Core 网站发布到Linux服务器
  8. Python组合数据类型:容器类型转换,list←→tuple←→set
  9. linux java 1.6 下载地址_linux 安装配置java环境 jdk1.6 jdk-6u45-linux-x64.bin
  10. 网络游戏外挂编写基础
  11. matlab2014启动很慢,matlab启动慢的解决方法
  12. iOS开发之openURL:(打电话,打开网页等)
  13. WinRAR v5.90 正式版简体中文汉化特别版本
  14. Keystore and keytool information
  15. 期货股票自动交易下单接口怎么执行策略函数?
  16. 我要偷偷的学Python,然后惊呆所有人(第二天)
  17. 数据分析师发展前景怎么样?
  18. 江苏单招C语言试题,江苏对口单招考试大纲-计算机类专业综合理论
  19. 消费者权益法规的精神
  20. PMI-ACP练习题(17)

热门文章

  1. java.lang.IllegalArgumentException: Can not set int field *** to null value
  2. 编程学习中要注意效率和感受
  3. 新加dell服务器硬盘状态不正确问题
  4. C语言随机函数调用两次为啥一样,C语言中随机函数应用
  5. windbg- !analyze -v 信息详解
  6. IOS-命令行打包ipa
  7. 神奇,5秒钟把几百字文章翻译成拼音,有了它教孩子拼音变这么简单
  8. 基于路径积分的图卷积和图池化
  9. HTTP网络启动安装原版系统ISO镜像
  10. 常用汉字字典拼音解释mysql数据表