面试题(20)|C/C++基础(11):类实例内存分配

C++面试题系列

目录

1.类的成员变量

1.1非静态成员变量

1.2静态成员变量

2.类的函数

参考文献:


1.类的成员变量

1.1非静态成员变量

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
};

class B {
private:
	short a;
};

class B1 {
public:
	short a;
};

class C {
private:
	short a;
	int b;
};

class C1 {
public:
	short a;
	int b;
};
int main() {
	A a;
	B b;
	C c;
	B1 b1;
	C1 c1;
	cout << "A:" << sizeof(A) <<";a:"<<sizeof(a)<< endl;
	cout << "B:" << sizeof(B) << ";b:"<<sizeof(b)<< ";B1:" << sizeof(B1) << ";b1:"<<sizeof(b1)<<endl;
	cout << "C:" << sizeof(C) <<";c:"<<sizeof(c)<< ";C:" << sizeof(C1) <<";c1:"<<sizeof(c1)<< endl;
	return 0;
}

结果:

说明:

1.类在实例化对象时需要在内存中分配一块独一无二的地址,为了空类的实例能够有一块独一无二的地址,编译器会给空类隐含的添加一个字节。

2.类的大小等于成员变量大小之和,sizeof(short)=2,所以Sizeof(B)==2.

3.多个成员变量时,需要字节对齐。C的第一个成员变量存放在offset为0的地方,第二个成员变量占4字节,故编译器插入2个字节凑足4的整数倍,使得第二个成员变量存放在offset为4的地方。

4.类的内存大小,与成员变量的访问属性无关,无论是public还是private都分配相同的内存。

1.2静态成员变量

代码例子:

// ClassAllocateMemory_static.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
};
class C {
public:
	static int a;
};

class B {
public:
	int a;
};

class D{
public:
	int b ;
	static int a;
};

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "A:" << sizeof(A) <<endl;
	cout << "B:" << sizeof(B) <<endl;
	cout << "C:" << sizeof(C) <<endl;
	cout << "D:" << sizeof(D) <<endl;
	return 0;
}

输出:

说明:

类A的大小等于类C的大小,类D的大小与类B的大小相等,说明静态成员变量不占用类的内存。

因为静态成员变量存放在静态区。

2.类的函数

// ClassAllocateMemory_static.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
public:
	int a;
};
class B {
public:
	int a;
	static int fun1(){return 0;}
};
class C {
public:
	int a;
	int fun(){return 0;}
};



class D{
public:
	int b ;
	virtual int fun2() {return 0;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "A:" << sizeof(A) <<endl;
	cout << "B:" << sizeof(B) <<endl;
	cout << "C:" << sizeof(C) <<endl;
	cout << "D:" << sizeof(D) <<endl;
	return 0;
}

输出:

说明:

可以看到类的静态成员函数和成员函数都不属于类和对象,因为成员函数和全局函数等都在代码段。掉用成员函数时会隐式的传个this过去,这个this作用其实就是将对象内所有成员变量传递进去。

虚函数会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表)。指针占用字节和机器字长有关,在32位机器上是4字节,如果在64位机器上,则是8个字节 。此处占用4个字节。

参考文献:

C++类的内存分配

C++类的内存分配

C++成员函数在内存中的存储方式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值