面试被问到的一道C++题

1

面试原话:一个只含有int的类对象占用多大内存?

面试结束后我在Win10上的vs2019试了一下,sizeof得到的结果是4。

现在有疑问的问题是:以下两个类所占用内存大小以及具体是如何计算的呢?

#include <iostream>
using namespace std;

class A {
public:
//同时包含5种数据类型
	char c;//1
	short s;//2
	int i;//4
	float f;//4
	double d;//8
};


class B {
public:
//只包含4种数据类型
	short s;//2
	int i;//4
	float f;//4
	double d;//8
};

int main() {
	A a;
	B b;
	cout << "sizeof(a) = " << sizeof(a) << endl;
	cout << "sizeof(b) = " << sizeof(b) << endl;
}

执行结果:

sizeof(a) = 24
sizeof(b) = 24
ava
方向盘

2021-9-24

0

简单来说:字节对齐。

默认情况下,编译器会按照 1、2、4、8、16 的方式分割内存。所以,short 是 2 个字节,要对齐到 2 的倍数位置;int 是 4 个字节,要对齐到 4 的倍数位置;double 是 8 个字节,要对齐到 8 的倍数位置。

例如 class B:

内存	变量		大小
0		short s;	2
2		空			2
4		int i;		4
8		float f;	4
12		空			4
16		double d;	8

另外,可以使用预编译指令 #pragma pack(n) 设置内存对齐位置,n = 1, 2, 4, 8, 16。例如,设置:

#pragma pack(1)

那么你的代码执行结果为:

sizeof(a) = 19
sizeof(b) = 18
ava
慢羊羊

2021-9-24

技术讨论社区