c++-C++内存问题,主要是关于对象占用内存,有些糊涂,敬请指导。

问题描述

C++内存问题,主要是关于对象占用内存,有些糊涂,敬请指导。

#include
class stu
{
private:
int a;
double c;
char p;
};
struct tea
{
int a;
int b;
};
int main()
{
stu st;
printf("%dn", sizeof(int));
printf("%dn", sizeof(double));
printf("%dn", sizeof(char
));
printf("%dn",sizeof(st));
tea te;
printf("%dn", sizeof(te));
}

代码如上,结果是:
4
8
4
24
8
64位机器下 visual studio 2013结果,
不太明白,为什么类会多出来8个字节。

解决方案

这个类的大小计算要字节对齐,类中最长的为double型8个字节,前后两个int都不足8字节,编译器会加上填充字节,3个8字节加起来就是24字节了 而不是实际的16字节.

解决方案二:

楼上说的对,所以好的程序员在编写代码时候最好把小字节的变量放在前面,这样可以节省内存。。

时间: 2024-12-24 20:33:46

c++-C++内存问题,主要是关于对象占用内存,有些糊涂,敬请指导。的相关文章

内存泄露-vc开发的程序占用内存一直在增大,是什么原因导致的?

问题描述 vc开发的程序占用内存一直在增大,是什么原因导致的? vc开发的程序占用内存一直在增大,是什么原因导致的?用bound checker也没检测到内存泄露啊,只是软件变得很卡. 解决方案 内存泄露只是没释放就直接放弃引用.也可能你一直引用着但是不再实际使用,这个是工具检查不出来的. 还是代码问题啊. 解决方案二: 你的程序有内存泄漏,多检查你的代码分配堆的地方 还有可能有其他资源泄漏.比如句柄,等 解决方案三: 1.你的程序应该是服务性程序吧,一直在运行: 2.检查自己检查代码,或者用内

Objective-C之集合对象的内存管理

集合对象的内存管理 本小节知识点: [掌握]集合对象的内存管理 [理解]集合对象内存管理总结 1.集合对象的内存管理 当一个对象加入到集合中,那么该对象的引用计数会+1 当集合被销毁的时候,集合会向集合中的元素发送release消息 NSMutableArray *arr = [[NSMutableArray alloc] init]; Person *p = [[Person alloc] init]; NSLog(@"retainCount = %lu", [p retainCou

建立对象数据库-内存映射范式,需要中间层容器的支持

对象|数据|数据库|中间层 在<设想使用XML和关系数据库形成一个对象数据库>一文中,已经阐述了关系数据库和对象数据库的主要区别:对外键的使用是通过直接记录,还是遍历外键子表来获得.而这里,是面对另一个重要的区别:如何释放对象的资源.对于对象数据库而言,它等同于是一批直接存于数据库中的串行化对象,它的实际存储形式到底是不是按关系结构存储并不是最重要的,重要的是调用程序读入内存的就是一个对象,而不是游标映射:这样,使用对象数据库就必须存在着一个如何清除用完的对象资源的问题:同时由于对象数据库必然

WINX窗口类对象的内存管理

为了引入WINX窗口类对象的内存管理(生命周期模型),我绕了一大圈子.实在是,内存 管理太重要了,花多少口舌介绍它都不过分.我曾经见到这样一句话:"C++程序员觉得 内存管理太重要了,所以一定要自己进行管理:Java/C#程序员觉得内存管理太重要了,所以 一定不能自己去管理".从某种意义上说,两者都是对的. 那么WINX的窗口对象是否也是采用gc allocator呢? 答:不是. 具体问题具体分析.在通常情况下,我个人确实已经非常习惯使用gc allocator来进行内 存管理,但是

c++类对象的内存模型

C++类对象内存结构 首先介绍一下C++中有继承关系的类对象内存的布局:在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中.之后是类中的成员变量的内存数据. 对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量).之后是子类自己的成员变量数据. 对于子类的子类,也是同样的原理.但是无论继承了多少个子类,对象中始终只有一个虚函数表指针. 为了探讨C++类对象的内存布局,先来写几个类和函数 首先写一个基类: class B

javase-JAVA程序给对象分配内存地址时是否可能有重复

问题描述 JAVA程序给对象分配内存地址时是否可能有重复 今天看了equals和hashcode两个方法,object中equals方法比较是两个对象的内存地址,规定返回true代表两个对象相同,那么hashcode返回的哈希码也一定要相同.但没有规定当两个对象不相同,返回的哈希码一定要不同,可能是相同的. 在hashcode和equals不被重写的情况下,难道程序在给两个不同的对象分配内存地址时可能出现相同的情况吗?一个对象分配到的内存地址难道不是唯一的? 解决方案 hashcode不是地址.

如何实现对象在内存中的修改和恢复

问题描述 如何实现对象在内存中的修改和恢复.比如有个类型:classStudent{publicstringName{get;set;}}为类型Student创建一个对象student,这时的student为原始对象.现在对student的属性Name做了如下修改:student.Name="csdn":然后我想把student的状态恢复回去,也就是student.Name为空.我的想法是在进行修改属性Name的操作前student对象在一块内存中,开始地址是0x12345678,然后

对象的分配-对象在内存中分配的时候,其属性是线性分配的吗?

问题描述 对象在内存中分配的时候,其属性是线性分配的吗? 比如说: class A { int i=1; double j=2.0; String s="xyz"; public void function() { } } 我的问题是:假如int是4字节,double是8字节,String是X个字节,请问4,8,X这些内存是连续分配的吗?像数组那样? 解决方案 不是,因为new的过程就是动态申请内存的过程,就像C中的malloc一样动态的申请内存的,应该是链式的结构吧,但是数组不一样的

源码分析:Java对象的内存分配

Java对象的分配,根据其过程,将其分为快速分配和慢速分配两种形式,其中快速分配使用无锁的指针碰撞技术在新生代的Eden区上进行分配,而慢速分配根据堆的实现方式.GC的实现方式.代的实现方式不同而具有不同的分配调用层次.  下面就以bytecodeInterpreter解释器对于new指令的解释出发,分析实例对象的内存分配过程: 一.快速分配 1.实例的创建首先需要知道该类型是否被加载和正确解析,根据字节码所指定的CONSTANT_Class_info常量池索引,获取对象的类型信息并调 用is_