struct和class内存大小的计算

结构体内存大小的计算:

用例一:

#include<stdio.h>
union ss
{
	int a;
	char b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//一个字节,补齐3个字节
	ss aa;//4个字节
	char temp3;//一个字节
	char temp4;//一个字节,补齐两个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出 16

解析:对齐规则是按照成员的声明顺序,依次安排内存,对齐字节数为最大成员变量的字节大小,偏移量为最大成员变量的字节数的整数倍,在这个程序中对齐字节数为4,计算步骤如下:

首先是temp1 四个字节,temp2 一个字节,还剩3个字节,因为后面是aa 4个字节,可以自己对齐,所以temp2需要补齐3个字节, temp3 一个字节,temp4一个字节,对齐是4个字节,还剩2个字节需要补齐。所以总共是16个字节。

#include<stdio.h>
union ss
{
	int a;
	double b;
};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1个字节,对齐是8个字节,还需3个字节补齐
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节,补齐还需要5个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为 24

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	int name;
	char sex;
	double num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//一个字节
	short temp4;//2个字节,补齐5个字节
	student people;//16个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  结果为 40

解析:此时需要注意的是,对齐字节数8个字节,而不是16个字节。student people 对象内部先进行一次对齐,然后如果如果是外面对齐字节数的整数倍就不需要

再进行对齐了,如果不是就需要再次进行对齐。

下面的是需要二次对齐的程序:

#include<stdio.h>
struct MyStruct
{
	char temp1;
	char temp2;
};
struct student
{
	int name;//4个字节
	char sex;//1个字节
	MyStruct aa;//2个字节
	char temp;//1个字节

};
int main()
{
	printf("%d", sizeof(student));

}

  输出为 8

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	//int name;
	//char sex;
	int num;

};
struct MyStruct
{
	int temp1;//4个字节
	char  temp2;//1一个字节,补齐3个字节
	ss aa;//8个字节
	char temp3;//1个字节
	short temp4;//2个字节
	student people;//4个字节,补齐一个字节
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  输出结果为:24

总结,在一个结构体中有另一个结构体的对象时,对齐字节数与这个结构体对象的字节数无关,只与结构体中的成员变量和union 有关。

类的内存大小的计算:

#include<iostream>
using namespace std;
class student
{
public:
	student()
	{
		cout << "构造函数" << endl;
	}
	//void fun();
};
int main()
{
	cout << sizeof(student) << endl;
	return 0;
}

  运行结果: 1

解析:如果是空类也会输出1。如果一个类只含有成员函数没有成员变量或者虚函数,类的大小都是1。如果含有静态成员变量或者是静态成员函数,也会是1,因为静态成员变量和静态成员函数是类的所有对象共享的,它并不存放在一个实例化对象中

为什么空类也会是1呢?

所谓类的实例化就是在内存中分配一块地址,每一个实例在内存中都有独一无二的地址,而了到达这个效果,编译器往往会给一个空类隐含的增加一个字节,这样实例化出来的每一个空类的对象都会得到一个独一无二的地址。如果空类的大小是0的话,那么实例化出来的所有空类对象都是在同样一个内存地址上,就相当于同一个对象,这不是我们想要的。

原文地址:https://www.cnblogs.com/wuyepeng/p/9862144.html

时间: 2024-07-31 09:53:14

struct和class内存大小的计算的相关文章

计算机中地址和内存大小的计算和编译出来的数据段

由地址计算内存大小(消除模糊认知) 在计算机中一个地址代表一个字节的内存的位置,即这个byte的门牌号,所以如果给出地址空间的起始地址是可以计算出内存大小的,比如STM32中Flash可编程的地址是从0x0800 0000开始到0x0801FFFF结束的所以内存大小的计算过程如下: 地址差 = 结束地址 - 开始地址  =  0x0001FFFF:他们可以表示的Byte的个数是N = 0x0001 FFFF + 1即0x00020000将N变换为十进制是131072. 内存大小 = N/1024

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

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:[email protected] 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所

Shell练习-计算一下所有进程所占用内存大小的和

ps 可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和.(提示,使用ps aux 列出所有进程,过滤出RSS那列,然后求和) #!/bin/bash #Calculate how much memory is occupied by this process #2015/07/22  ps aux |awk -F' ' '{(sum=sum+$6)};END{print sum}'

java对象占用内存大小计算方式

案例一: User public class User { } UserSizeTest public class UserSizeTest { static final Runtime runTime=Runtime.getRuntime(); public static void main(String[] args) { final int count = 100000; User[] us=new User[count]; long heap1 = 0; for (int i = -1;

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

1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): 对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息.如哈希码.GC分代年龄.锁状态标示.线程持有的锁等.这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit.官方称呼是"Mark Word". 第二部分是类型指针,或者说指向类的元数据信息的引用.

HDP3.1 中 YRAN 和 MR2 的内存大小配置的计算方式

Container 是 YARN 中基本的处理单元,它是对内存.CPU等计算的封装.总的来说,每个core每块硬盘 分配2个 container,能获得较好的集群利用率. 1. 确定可用内存大小. 对于每台主机来说,YARN 和 MapReduce 能用内存大小是除去预留给系统的内存(如果还有 HBase,还要相应留内存给它)后的大小,即: YARN 可用内存(RAM for YARN) = 总内存(Total RAM) - 系统预留(Reserved for System) - HBase预留

如何去计算hdfs中namenode中所需的堆内存大小

请参考 上一个 链接地址:hdfs为什么不擅长存储大量小文件https://blog.51cto.com/12445535/2354951 概述:namenode replication(复制)复制 默认块复制因子(dfs.replication)为3.复制影响磁盘空间但不影响内存消耗.复制会更改每个块所需的存储量,但不会更改块的数量.如果DataNode上的一个块文件(由NameNode上的一个块表示)被复制三次,则块文件的数量将增加三倍,但不会代表它们的块数. 关闭复制时,一个192 MB的

【转】C/C++ struct/class/union内存对齐

原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括stru

C/C++ struct/class/union内存对齐

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon. 2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"