结构体、类、虚函数的内存大小

一、概要

C++里结构体和类除了默认访问不一样外,其他基本是一样的,结构体可以有函数甚至是虚函数,所以内存大小上也是一样。但内存的大小不是简单地把所有成员变量的大小加起来就可以,需要考虑对齐、虚函数等,具体看测试的结果。

二、测试代码

#pragma once
#include "stdafx.h"
#include <stdio.h>
class MemoryClassAlign0
{
    
    
	char a;
};
class MemoryClassAlign1
{
    
    
	char a;
	char c;
	int b;
};
class MemoryClassAlign2
{
    
    
	char a;
	int b;
	char c;
};
class MemoryClassEmpty
{
    
    

};
class MemoryClassNormal
{
    
    
public:
	char a;
	char c;
	int b;
	void func()
	{
    
    

	}
};
class MemoryClassVirtual1
{
    
    
public:
	char a;
	char c;
	int b;
	virtual void func1()
	{
    
    

	}
};

class MemoryClassVirtual2
{
    
    
public:
	char a;
	char c;
	int b;
	virtual void func1()
	{
    
    

	}
	virtual void func2()
	{
    
    

	}
};
class MemorySizeTest
{
    
    
public:
	void doTest()
	{
    
    
		printf("empty=%d align0=%d align1=%d align2=%d normal=%d virtual1=%d  virtual2=%d\n"
			, sizeof(MemoryClassEmpty),sizeof(MemoryClassAlign0), sizeof(MemoryClassAlign1) , sizeof(MemoryClassAlign2)
			, sizeof(MemoryClassNormal), sizeof(MemoryClassVirtual1), sizeof(MemoryClassVirtual2));

	}

};

三、输出结果

empty=1 align0=1 align1=8 align2=12 normal=8 virtual1=12 virtual2=12

四、结论

  • 类和结构体在内存占用上是一样的。
  • 空的类或结构体不是0字节,而是需要占用1个字节,否则地址可能指向其他数据去了。
  • 数据会四字节对齐,因为内存一次取32位数据,对齐可以避免一个32位数据需要分两次取。
  • 只有一个字节的结构体不会四字节对齐,只占1个字节。如果最后有一个字节的数据,那么也会占用4个字节。
  • 如果类包含虚函数,不管虚函数个数多少,多只增加4个字节,原因是需要一个32位虚函数指针指向虚表。虚函数是每个对象里都有一个,而虚表只需一张,不算在对象大小里。

猜你喜欢

转载自blog.csdn.net/gamekit/article/details/107293831