长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Hello world
  • C++ 数据类型
  • 运算符优先级
  • 命名空间
  • 多线程的基本用法(C++11)
  • C++类对象的成员内存占用
    • 不同对象的内存占用
    • 示例
      • 代码
      • 结果
  • C++
DC Wang
2023-11-16
目录

C++类对象的成员内存占用

# C++类对象的成员内存占用

在C++中,类对象的内存布局受到许多因素的影响,包括成员变量的类型、顺序、对齐方式以及是否包含虚函数等。下面给出一些例子来说明不同情况下类对象的内存占用情况。

# 不同对象的内存占用

  1. 空类对象:

    class EmptyClass {};
    
    1

    空类对象通常占用一个字节的内存,因为在C++中空对象的实例不能具有零大小,以确保每个对象在内存中有独一无二的地址。

  2. 普通类对象:

    class MyClass {
    public:
        int x;
        double y;
        char z;
    };
    
    1
    2
    3
    4
    5
    6

    普通的类对象的大小等于其成员变量的大小之和,再加上可能的对齐空隙。成员变量的对齐方式通常是按照其自身大小的最大值进行的。

  3. 带有函数的类对象:

    class ClassWithFunction {
    public:
        void myFunction() {}
    };
    
    1
    2
    3
    4

    类中的成员函数并不会直接增加类对象的大小,因为成员函数是与类共享的,不会被复制到每个对象中。

  4. 包含虚函数的类对象:

    class BaseClass {
    public:
        virtual void virtualFunction() {}
    };
    
    class DerivedClass : public BaseClass {
    public:
        int x;
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    当类包含虚函数时,通常会有一个指向虚函数表(vtable)的指针,这个指针的大小与系统相关,一般是一个指针的大小。因此,包含虚函数的类对象会比没有虚函数的对象多一个指针的大小。

  5. 多重继承的类对象:

    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

这个程序定义了上述的各种类,并使用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
编辑 (opens new window)
#C++
上次更新: 2023/11/18, 10:50:32
多线程的基本用法(C++11)

← 多线程的基本用法(C++11)

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式