C++ 结构体核心特性:内存布局、与类区别及多态实现

阿橙
阿橙
发布时间:2026-10-16| 7人浏览过
原创

C++中的struct不仅是简单的数据集合,还涉及内存对齐、访问控制及多态机制。了解其与普通class的区别以及如何在无继承情况下模拟虚函数,对于掌握C++底层内存布局至关重要。

struct 结构体的内存占用与对齐

在C++中,空结构体并不占用0字节内存,而是固定占用 1 个字节。这是为了区分不同的对象实例,确保每个对象在内存中有唯一的地址。

struct Temp{};
sizeof(Temp); // 结果为 1

当结构体包含成员变量时,编译器会根据字节对齐规则调整内存布局,以提高CPU寻址效率。主要遵循两条规则:

  1. 偏移量规则:每个成员变量的首地址必须是该成员大小(或编译器指定对齐系数)的整数倍。
  2. 总大小规则:结构体的总大小必须是最大成员变量大小的整数倍。

以下示例展示了不同成员顺序对内存大小的影响:

// 示例1:int在前,char在后
struct Stu {
    int age;      // 4字节,偏移0
    char sex;     // 1字节,偏移4
                  // padding3:填充3字节,使age的下一个元素如果存在则对齐
};
// sizeof(Stu) = 8 (4 + 1 + 3padding)
// 总大小8是最大成员int(4)的倍数

// 示例2:char在前,int在后
struct Stu2 {
    char sex;     // 1字节,偏移0
                  // padding3:填充3字节,使age满足4字节对齐
    int age;      // 4字节,偏移4
};
// sizeof(Stu2) = 8 (1 + 3padding + 4)
// 通过调整顺序优化了内存使用(若只考虑这两个成员,实际可能相同,但若嵌套其他类型会影响)

struct 与 class 的主要区别

虽然语法相似,但 struct 和 class 在C++中有语义和默认行为的差异:

1. 默认访问控制权限

  • struct:所有成员默认的访问权限为 public,适合用于纯数据聚合。
  • class:所有成员默认的访问权限为 private,支持封装性,适合定义对象行为。

2. 设计用途

  • struct:通常作为数据的集合(Data Aggregation),侧重于数据结构本身,较少包含复杂逻辑。
  • class:作为对象(Object),是属性(数据)和方法(行为)的结合体,强调面向对象的设计思想。

利用 C 风格结构体模拟虚函数

虽然 struct 不支持 C++ 标准的虚函数机制(vtable),但在某些底层开发或嵌入式场景中,可以通过函数指针实现类似多态的行为。这种方法本质上是手动维护一个函数表。

实现思路如下:

  1. 定义一个函数指针类型 typedef。
  2. 在结构体中嵌入该函数指针成员。
  3. 在使用结构体实例前,手动赋值对应的具体函数地址。
#include <stdio.h>

// 1. 定义函数指针类型
typedef int (*getSexFunc)(void);

// 父类相关函数
int getParentSex() {
    return 1;
}

// 子类相关函数
int getSonSex() {
    return 2;
}

// 2. 定义结构体,包含函数指针
struct Parent {
    getSexFunc getSex;
};

struct Son {
    getSexFunc getSex;
};

int main() {
    struct Parent parent;
    // 3. 绑定具体函数(模拟动态绑定)
    parent.getSex = getParentSex;

    struct Son son;
    son.getSex = getSonSex;

    // 调用函数指针
    printf("Parent sex is %d\n", parent.getSex());
    printf("Son sex is %d\n", son.getSex());

    getchar();
    return 0;
}

注意:这种手法破坏了C++的标准多态机制,代码可读性和安全性较低,仅适用于特定兼容层或底层抽象场景,常规开发建议使用标准虚函数和多态继承。

总结

以上就是C++结构体在内存布局、与类区别及特殊用法方面的详细内容。理解字节对齐有助于优化数据结构性能,而区分struct与class有助于选择合适的数据抽象方式。更多关于C++底层技术的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。