什么是 POD 数据类型

本文详细阐述了C++中的POD数据结构概念,包括其定义、特征(平凡且布局有序)、为何存在非POD对象及其影响。重点讲解了平凡类的条件(默认构造/析构、无虚函数),以及POD类型的优势和在复杂结构中的注意事项。
摘要由CSDN通过智能技术生成

背景:

几乎所有的系统底层都是用 C 写的,当时定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等,编译器都可以正确的把它解析出来。到了 C++ 诞生之后,出现了继承、派生这样新的概念,于是就诞生了一些新的数据结构。比如某个派生类,C 语言中哪有派生的概念啊,遇到这种数据编译器就不认识了。为了和旧的 C 数据相兼容,C++ 就提出了 POD 数据结构概念。

POD 是 Plain Old Data 的缩写,Plain 代表它是一个普通类型,Old 代表它是旧的。

能用 C 的 memcpy() 等函数进行操作的类、结构体就是 POD 类型的数据

对于任何POD对象,我们都可以放心大胆地使用memset()、memcpy()、memcmp()等函数对对象的内存数据进行操作。

由于非POD对象的存在,在C++中使用memcpy()系列函数时要保持足够的小心。为什么C++中的对象有可能不是一个POD呢?这还要从C++的重要特征之一—动多态说起。动多态的一个基本支撑技术就是虚函数。

目的在于:基本上谈到这个概念,一般都是说某某 class、struct、union 是不是 POD 类型的。

那什么样的类、结构体是拥有 POD 特性的呢?

要求有两个:

1.一个是它必须很平凡、很普通;

2另一个是布局有序。

能平凡就平凡

1.拥有默认的构造函数和析构函数。不能自定义写 构造/析构函数拷贝/移动构造函数拷贝/移动运算符,而是用编译器自动为我们生成,那这个数据就是“平凡的”。非要写的话,用 C++ 11 的 default 关键字。

class MyClass
{
public:
    MyClass() = default;
    MyClass(int a) :m_i(a) {
    };
    ~MyClass();

private:
    int m_i;
};

MyClass::MyClass()
{
}

MyClass::~MyClass()
{
}

一旦定义了构造函数,即使构造函数不包含参数、函数体也没有任何代码,该构造函数也不再平凡。

2.不能有 虚函数 和 虚基类。

解释:虚基类是指在多次继承中通过虚继承的基类。

布局要有序

前提:我们把非静态数据称为普通数据。

1.普通成员有相同的访问级别(private、public、protected)。

延伸:struct默认共有,class默认私有

2.第一个成员必须是自己的。即类的第一个非静态成员的类型与基类不同。

3.在类或者结构体继承时,普通成员只能在基类或者派生类其中一个类中,不可分散.要么在基类,要么在派生类。

pod的好处

1.字节赋值,可以安全使用memset和memcpy对pod类型进行初始化和拷贝操作。

2.提供对c内存布局兼容。

3.保证静态初始化的安全有效。

延伸:

但如果结构体或类是含有散列容器等嵌套的复杂结构体,使用memset进行初始化容易出错。

typedef struct tagDataInfo
{
    long offs;                // 索引
    char name[20];            // 姓名
    std::list<int> ord_list;  // 定单索引列表
    std::map<std::string, std::string> str_map; // 编号对应管理
 
    tagDataInfo() { memset(this, 0, sizeof(*this)); };
} DataInfo;

程序执行的时候,程序core dump了。

原因是:std::list 和std::map 都是散列容器,存储的内存不是连续的。如果是std::vector就不会报错。

应该是

typedef struct tagDataInfo
{
    long offs;                // 索引
    char name[20];            // 姓名
    std::list<int> ord_list;  // 定单索引列表
    std::map<std::string, std::string> str_map; // 编号对应管理
 
    tagDataInfo() 
    { 

       offs = 0;
        memset(name, '0', sizeof(char) * 20);
        ord_list.clear();
        str_map.clear();
    };
} DataInfo;

说明了不要随便对结构体和类调用memset、memcpy函数。

PV(Persistent Volume)和 PVC(Persistent Volume Claim)是 Kubernetes 中用于持久化存储的概念,而 Pod 和 etcd 是 Kubernetes 中的核心组件。 1. PV(Persistent Volume):PV 是对底层存储资源的抽象,它表示一个持久化存储卷,可以是物理存储设备、网络存储或云存储等。PV 需要管理员手动创建,并且是集群级别的资源。它定义了存储的容量、访问模式、持久化类型等属性。 2. PVC(Persistent Volume Claim):PVC 是 Pod 对 PV 的请求,它表示对持久化存储的需求。PVC 可以被开发人员创建,并且是命名空间级别的资源。通过 PVC,开发人员可以声明所需的存储容量、访问模式等属性,并将其绑定到一个可用的 PV 上。 3. PodPod 是 Kubernetes 中最小的可部署单元,它可以包含一个或多个容器。Pod 是应用程序的实际运行实例,每个 Pod 都有自己的 IP 地址和存储卷。Pod 可以使用 PVC 来访问持久化存储。 4. etcd:etcd 是 Kubernetes 的核心组件之一,用于存储和管理集群的状态信息。etcd 是一个高可用的分布式键值存储系统,用于保存集群的配置数据、状态信息和元数据。 用法: - PV 的创建和管理由集群管理员负责,开发人员通常不直接与 PV 交互。管理员可以在集群中预先创建 PV,并定义其属性。 - 开发人员可以创建 PVC 来声明对持久化存储的需求。PVC 会自动匹配并绑定到一个可用的 PV 上,然后可以将 PVC 挂载到 Pod 中的容器中。 - Pod 可以通过 PVC 访问持久化存储。容器可以在 Pod 中访问挂载在 PVC 上的存储卷,并进行读写操作。 - etcd 是 Kubernetes 的核心组件之一,负责存储和管理集群的状态信息。etcd 可以被视为一个持久化存储,用于保存 Kubernetes 集群的配置数据、状态信息和元数据。 综上所述,PV 和 PVC 是用于管理持久化存储的概念,Pod 是应用程序运行的实例,etcd 是 Kubernetes 的核心组件之一,用于存储和管理集群的状态信息。它们合作共同实现了 Kubernetes 中的持久化存储和集群管理功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值