C++类对象的成员内存占用
# C++类对象的成员内存占用
在C++中,类对象的内存布局受到许多因素的影响,包括成员变量的类型、顺序、对齐方式以及是否包含虚函数等。下面给出一些例子来说明不同情况下类对象的内存占用情况。
# 不同对象的内存占用
空类对象:
class EmptyClass {};
1空类对象通常占用一个字节的内存,因为在C++中空对象的实例不能具有零大小,以确保每个对象在内存中有独一无二的地址。
普通类对象:
class MyClass { public: int x; double y; char z; };
1
2
3
4
5
6普通的类对象的大小等于其成员变量的大小之和,再加上可能的对齐空隙。成员变量的对齐方式通常是按照其自身大小的最大值进行的。
带有函数的类对象:
class ClassWithFunction { public: void myFunction() {} };
1
2
3
4类中的成员函数并不会直接增加类对象的大小,因为成员函数是与类共享的,不会被复制到每个对象中。
包含虚函数的类对象:
class BaseClass { public: virtual void virtualFunction() {} }; class DerivedClass : public BaseClass { public: int x; };
1
2
3
4
5
6
7
8
9当类包含虚函数时,通常会有一个指向虚函数表(vtable)的指针,这个指针的大小与系统相关,一般是一个指针的大小。因此,包含虚函数的类对象会比没有虚函数的对象多一个指针的大小。
多重继承的类对象:
class A { public: int a; }; class B { public: double b; }; class MultipleInheritance : public A, public B { public: char c; };
1
2
3
4
5
6
7
8
9
10
11
12
13
14多重继承的类对象的内存布局将包含基类的成员变量,并根据对齐规则填充可能的对齐空隙。
需要注意的是,对于上述的示例,实际的内存布局可能会因编译器、编译选项和目标平台的不同而有所变化。可以使用sizeof
运算符来获取类对象的大小。
# 示例
# 代码
下面是一个简单的C++测试程序,演示了上述各种情况下类的大小:
#include <iostream>
class EmptyClass {};
class MyClass {
public:
int x;
double y;
char z;
};
class ClassWithFunction {
public:
void myFunction() {}
};
class BaseClass {
public:
virtual void virtualFunction() {}
};
class DerivedClass : public BaseClass {
public:
int x;
};
class A {
public:
int a;
};
class B {
public:
double b;
};
class MultipleInheritance : public A, public B {
public:
char c;
};
int main() {
std::cout << "Size of EmptyClass: " << sizeof(EmptyClass) << " bytes\n";
std::cout << "Size of MyClass: " << sizeof(MyClass) << " bytes\n";
std::cout << "Size of ClassWithFunction: " << sizeof(ClassWithFunction) << " bytes\n";
std::cout << "Size of BaseClass: " << sizeof(BaseClass) << " bytes\n";
std::cout << "Size of DerivedClass: " << sizeof(DerivedClass) << " bytes\n";
std::cout << "Size of MultipleInheritance: " << sizeof(MultipleInheritance) << " bytes\n";
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
这个程序定义了上述的各种类,并使用sizeof
输出它们的大小。
# 结果
输出的大小可能会因为编译器、编译选项和目标平台的不同而有所变化。本机以x86_64 的Ubuntu 18.04为例
Size of EmptyClass: 1 bytes
Size of MyClass: 24 bytes
Size of ClassWithFunction: 1 bytes
Size of BaseClass: 8 bytes
Size of DerivedClass: 16 bytes
Size of MultipleInheritance: 24 bytes
1
2
3
4
5
6
2
3
4
5
6
编辑 (opens new window)
上次更新: 2023/11/18, 10:50:32
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05