一、概要
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位虚函数指针指向虚表。虚函数是每个对象里都有一个,而虚表只需一张,不算在对象大小里。