C++11之POD类型

2023-05-16

什么是POD类型

POD的全称叫做Plain Old Data,简单讲就是一个类或者一个结构体通过二进制拷贝之后还能保持其不变,那么这个类型就是POD类型。

什么类型属于POD类型

当一个类型具有平凡的定义和标准布局这两种情况时,才可以说这种类型是POD类型。

什么是平凡的定义的类型

当一个类具有以下的几个定义时,才可以说是平凡的类:

  • 拥有平凡的默认构造函数和析构函数
    这里的平凡的默认构造函数是指在不定义构造函数的情况下,编译器默认生成的构造函数。如果自己定义了构造函数,但是什么都没有做,仍然不是平凡的构造函数,可以使用=default来定义。

  • 拥有平凡的拷贝构造函数和移动构造函数

  • 拥有平凡的拷贝赋值函数和移动赋值函数
  • 不能包含虚函数和虚基类

代码示例

#include <iostream>   
using namespace std;  

class A { A(){} };  
class B { B(B&){} };  
class C { C(C&&){} };  
class D { D operator=(D&){} };  
class E { E operator=(E&&){} };  
class F { ~F(){} };  
class G { virtual void foo() = 0; };  
class H : G {};  
class I {};  

int main(int argc, _TCHAR* argv[])  
{  
    std::cout << std::is_trivial<A>::value << std::endl;  // 有不平凡的构造函数  
    std::cout << std::is_trivial<B>::value << std::endl;  // 有不平凡的拷贝构造函数  
    std::cout << std::is_trivial<C>::value << std::endl;  // 有不平凡的拷贝赋值运算符  
    std::cout << std::is_trivial<D>::value << std::endl;  // 有不平凡的拷贝赋值运算符  
    std::cout << std::is_trivial<E>::value << std::endl;  // 有不平凡的移动赋值运算符  
    std::cout << std::is_trivial<F>::value << std::endl;  // 有不平凡的析构函数  
    std::cout << std::is_trivial<G>::value << std::endl;  // 有虚函数  
    std::cout << std::is_trivial<H>::value << std::endl;  // 有虚基类  

    std::cout << std::is_trivial<I>::value << std::endl;  // 平凡的类  

    system("pause");  
    return 0;  
}  

什么是标准布局的类型

  • 所有非静态成员具有相同的访问权限
  • 在继承树中最多只有一个类中有非静态数据成员
  • 子类中的第一个非静态成员的类型与其基类不同
    因为如果相同,C++会为基类分配1字节的空间,因为C++中规定相同类型的对象必须拥有不同的地址
  • 没有虚函数和虚基类
  • 所有非静态数据成员均符合标准布局类型,其基类也符合标准布局

代码示例

#include <iostream>  

using namespace std;  

class A   
{   
private:  
    int a;  
public:  
    int b;  
};  

class B1  
{  
    static int x1;  
};  

class B2  
{  
    int x2;  
};  

class B : B1, B2  
{  
    int x;  
};  

class C1 {};  
class C : C1  
{  
    C1 c;  
};  

class D { virtual void foo() = 0; };  
class E : D {};  
class F { A x; };  

int _tmain(int argc, _TCHAR* argv[])  
{  
    std::cout << std::is_standard_layout<A>::value << std::endl;  // 违反定义1。成员a和b具有不同的访问权限  
    std::cout << std::is_standard_layout<B>::value << std::endl;  // 违反定义2。继承树有两个(含)以上的类有非静态成员  
    std::cout << std::is_standard_layout<C>::value << std::endl;  // 违反定义3。第一个非静态成员是基类类型  
    std::cout << std::is_standard_layout<D>::value << std::endl;  // 违反定义4。有虚函数  
    std::cout << std::is_standard_layout<E>::value << std::endl;  // 违反定义5。有虚基类  
    std::cout << std::is_standard_layout<F>::value << std::endl;  // 违反定义6。非静态成员x不符合标准布局类型  

    system("pause");  
    return 0;  
}

POD类型的使用方法

下面一个一个复制POD类型为例的代码

#include <iostream>  
#include <Windows.h>  

using namespace std;  

class A   
{   
public:  
    int x;  
    double y;  
};  

int _tmain(int argc, _TCHAR* argv[])  
{  
    if (std::is_pod<A>::value)  
    {  
        std::cout << "before" << std::endl;  
        A a;  
        a.x = 8;  
        a.y = 10.5;  
        std::cout << a.x << std::endl;  
        std::cout << a.y << std::endl;  

        size_t size = sizeof(a);  
        char *p = new char[size];  
        memcpy(p, &a, size);  
        A *pA = (A*)p;  

        std::cout << "after" << std::endl;  
        std::cout << pA->x << std::endl;  
        std::cout << pA->y << std::endl;  

        delete p;  
    }  

    system("pause");  
    return 0;  
} 

POD类型的好处

  1. 字节赋值。这样就可以使用C语言中的memset和memcpy对POD类型进行初始化
  2. 提供C对的内存布局的兼容。因为POD类型的数据在C和C++间的操作都是安全的
  3. 保证静态初始化的安全。静态初始化可以提高性能,POD类型对象的初始化更加简单
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11之POD类型 的相关文章

  • k8s与pod概念

    此文章为学习过程中根据网上资源整合总结 文章目录 1 为什么需要k8s1 1 应用部署模式的演进1 11 模式对比1 12 各模块介绍 1 2 管理大量的容器 k8s 2 ks8的集群架构3 pod k8s调度的最小单元3 1 一个 pod
  • k8s-----------高级pod&调度

    目录 pod进阶pod重启策略 健康检查 探针调度约束调度方式 故障排除 pod进阶 limits cup cpu上限limits memory 内存上限requests cpu 创建时分配的基本CPU资源requests memory 创
  • k8s核心概念 pod调度和生命周期

    文章目录 调度约束方法nodeNamenodeSelector Pod调度流程pod生命周期生命周期概述 pod生命周期流程容器启动容器终止容器重启策略回顾容器生命周期 健康检查健康检查方式Probe探测方式探测方式举例liveness e
  • kubernetes Pod高级用法-探针

    POD 2高级用法 容器探测详解 所谓容器探测就是我们在里面设置了一些探针 xff0c 或者传感器来获取相应的数据用来判断容器存活与否或者就绪与否的标准 xff1b 目前k8s支持的存活性探测方式和就绪性探测方式都是一样的 xff0c 探针
  • k8s 怎么修改pod所在的子网cidr

    如果你想修改 pod 所在的子网 CIDR xff0c 你需要修改 kubernetes 集群的网络配置 这通常是由集群管理员来完成的 xff0c 因为修改网络配置可能会影响集群中的所有节点和 pod 要修改网络配置 xff0c 你需要使用
  • K8S内部pod之间相互调用案例和详解

    目录 一 部署nginx容器 二 部署tomcat服务 三 使用nginx代理tomcat服务 四 测试 服务发现简介 xff1a 1 service是用于K8S的服务发现的重要组件 xff0c pod作为运行业务的承载方式 xff0c 要
  • K8S pod 亲和与反亲和 (podAffinity与podAntiAffinity)

    目录 1 简介 xff1a 2 配置须知 xff1a 示例 xff1a 一 创建前端nginx容器 二 创建后端容器 xff0c 与nginx容器做软亲和 三 创建后端容器 xff0c 与nginx容器做硬亲和 1 简介 xff1a 前面介
  • kubernetes单个pod运行两个容器yaml文件实践

    kubernetes单个pod运行两个容器yaml文件实践 1 rc的yaml文件 apiVersion v1 kind Replicationtroller metadate name baolei rc spec replicas 1
  • CocoaPods的使用——pod install pod install --repo-update pod update pod update --repo-update

    Podfile文件中 xff0c 使用某个库时 不指定版本 xff0c 表示希望使用最新版本 xff0c 如 pod SDWebImage 指定明确版本 xff0c 表示只想要这个版本 xff0c 如 xff1a pod 39 SDWebI
  • kubelet残留孤儿pod(Orphaned pod)无法删除

    记录kubelet残留孤儿pod Orphaned pod 无法删除的问题分析和解决方法 问题 查看kubelet日志 xff0c 错误信息如下 xff1a E0823 10 31 01 847946 1303 kubelet volume
  • k8s(一)—pod管理、资源清单编写

    1 pod管理 k8s官方文档 root 64 server2 kubectl run nginx image 61 nginx 运行一个容器 xff0c 镜像为nginx pod nginx created root 64 server2
  • K8S Pod

    Pod管理 Pod是可以创建和管理Kubernetes计算的最小可部署单元 xff0c 一个Pod代表着集群中运行的一个进程 xff0c 每个pod都有一个唯一的ip 一个pod类似一个豌豆荚 xff0c 包含一个或多个容器 xff08 通
  • pod、container、sidecar

    pod是一个小家庭 xff0c 它把密不可分的家庭成员 container 聚在一起 xff0c Infra container则是家长 xff0c 掌管家中共通资源 xff0c 解决顺序和依赖关系 xff0c 家庭成员通过sidecar方
  • k8s pod里访问不到外部ip_Kubernetes中的Pod无法访问外网-Ubuntu16.04 LTS

    Kubernetes中的Pod无法访问外网 Ubuntu16 04 LTS 安装完Kubernetes后 xff0c 在Pod中使用wget无法访问外网URL地址 xff0c 但是使用IP地址是可以访问 xff0c 应该是 Pod内无法解析
  • C++11之POD类型

    什么是POD类型 POD的全称叫做Plain Old Data xff0c 简单讲就是一个类或者一个结构体通过二进制拷贝之后还能保持其不变 xff0c 那么这个类型就是POD类型 什么类型属于POD类型 当一个类型具有平凡的定义和标准布局这
  • k8s-pod的亲和度调度

    文章目录 1 Node Affinity 1 1 node节点的预制标签 1 2 自定义标签 1 2 1 给node增加标签 1 2 2 修改label 1 2 3 修改label 1 3 Require 1 4 Perferred 1 3
  • IOS 解决安装POD报You don't have write permissions for the /usr/bin directory的错误

    这段时间开始做IOS开发 使用pod管理第三方库 由于一些第三方不兼容最新的pod 所以要安装旧版本的pod 其中遇到的问题就是 You don t have write permissions for the usr bin direct
  • dyld: Library not loaded:

    dyld Library not loaded 问题 在使用阿里的开源库LazyScrollView的时候出现的这个问题 本地Xcode11 4 1 真机调试 dyld Library not loaded rpath LazyScroll
  • 获取IronSource的广告源Pod和Maven版本

    接入IronSource库后 现在可以选择Maven或者Pod的形式导入相关广告源 Ironsource官网上有一个入口 可以方便的获取接入广告源的Maven和Pod Android https developers ironsrc com
  • iOS编译中pod报错CocoaPods could not find compatible versions for pod "XXXXX":

    pod install no repo update Analyzing dependencies CocoaPods could not find compatible versions for pod XXXXX In snapshot

随机推荐

  • Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

    文章目录 Nginx的源码目录结构Nginx中configure的原理auto脚本 模块编译顺序 Nginx的源码目录结构 nginx的源码目录与nginx的模块化以及功能的划分是紧密结合 xff0c 这也使得我们可以很方便地找到相关功能的
  • C语言中命令行工具 (getopt和getopt_long)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • C#与Java的比较

    关于java和C 争论不是一年两年了 贬低C 的文章也看过了很多 说一下个人见解 C 本身并不是不如java C 的优势在于学了之后在web和winform之间可以自由切换 web现在 net mvc已经效率很高了 企业级的应用现在很受欢迎
  • vs2010 和 vs2012同时安装遇到的问题

    安装VS2012后遇到的问题 悲剧的种子是在上个月初种下的 9月份微软发布了Visual Studio2012 xff08 发布会 xff09 xff0c 我是个对各种 新版本 极有偏好的人 xff0c 一看到新闻就立刻下载了VS2012
  • React警告:Received NaN for the `children` attribute. If this is expected, cast the value to a string.

    使用React框架时 xff0c 组件在使用 lt span gt Math abs goal goalInfo pretimes goal usergoalInfo cpt times lt span gt 这一语句时出现警告 xff1a
  • 持续请求/socket.io/?EIO=3&transport=polling&t=N8HrzIR

    项目基本介绍 xff1a 使用React xff0c webpack xff0c socket io client Node js Express socket io 等技术 xff0c 采用前后端分离开发 实现项目中的聊天室时遇到报错 x
  • node-xlsx 生成并下载有超链接的excel文件

    需求 xff1a 将微信小程序云数据库中的数据导出为excel文件 xff0c 文件按团队分为不同的sheet页 xff0c 首页汇总每个sheet页的数据总数 xff0c 并可点击跳转至对应的sheet页 下载时可选择今年某月份进行下载对
  • Vue通过v-for渲染的元素与$refs得到的实例对应不上

    开发时遇到一个bug xff1a 通过v for渲染出几个搜索条件组件 xff08 对应的数组数据记为selectList xff09 xff0c 通过其他方式修改了这些筛选条件对应的数据selectList xff0c 之后通过 refs
  • iView的Select 选择器选择失效

    问题 xff1a 给iView的Select赋的值通过接口获取 xff0c 得到数组 list xff0c 选择器的默认值 defaultValue 为数组list的第一个选择项 xff08 defaultValue 61 list 0 x
  • 不同路由对应同一组件页面

    在vue中 xff0c 当不同路由对应同一组件页面时会发生再次进入页面时不再重新渲染 xff08 为了更高效 xff0c 所以vue进行了复用 xff09 的问题 xff0c 整理一下解决办法 xff0c 如下 xff1a 方式一 Watc
  • /deep/样式穿透失效的原因和解决办法

    问题 xff1a vue页面中 xff08 样式使用less书写 xff09 xff0c 对iview的组件使用 deep 进行样式穿透修改默认样式 xff0c 发现在Google Chrome版本64上看样式修改成功 xff0c 但在火狐
  • 错误:ERROR in ./node_modules/_webpack-dev-server...Module not found: Error: Can't resolve 'webpack/hot

    学习webpack的途中总是困难重重 使用webpack dev server工具时 xff0c 运行cnpm run dev后报错 xff1a ERROR in node modules webpack dev server 64 2 1
  • 带参数的宏定义与有参函数的区别

    1 先介绍一下什么是宏定义 宏定义属于C语言编译系统中编译预处理中的一部分 xff08 但编译预处理不是C语言的语句 xff09 xff0c 其作用是为编译系统提供必要的前置信息 xff0c 告诉编译系统在源程序进行编译之前应该做些什么 它
  • UART接口控制器-RS-232的9脚接口

    RS 232常见引脚信号的定义 RXD 接收数据 xff0c TXD 发送数据 xff0c DTR 数据终端准备 xff0c GND 信号地 xff0c DSR 数据设备准备好 xff0c RTS 请求发送 xff0c CTS 清除发送 串
  • 去掉字符串最后一个字符的方法

    C 开发过程中一般都需要进行字符串的格式化处理 xff0c xff0c 以下提供去掉字符串最后一个字符的方法 如果是其他语言开发的话仅供参考有可能写法不一样 xff0c 但是意思是一样的 字符串 xff1a string s 61 34 1
  • C++11之lambda函数

    最近一直在看mesos的源代码 xff0c mesos中用到了很多C 43 43 11的新特性 xff0c lambda函数就是其中的一个 对于lambda函数简单的来说就是java中的匿名函数 语法定义 capture paramente
  • C++中两个类互相包含

    今天突然想起一个C 43 43 的问题 xff0c 如果一个类A包含类B的实例 xff0c 而实例B也包含另一个类A xff0c 这种方式的代码应该怎么写 xff0c 按照一般的开发者的想法的代码如下 xff1a 文件A h span cl
  • 命名空间

    命名空间的作用 命名空间是为了防止名字冲突提供更加可控的机制 命名空间分割了全局命名空间 xff0c 其中每一个命名空间是一个作用域 命名空间的定义 命名空间由三部分组成 xff0c 分别是namespace 空间名字和一系列由花括号括起来
  • STL中的swap函数

    swap函数执行会调用容器内数据类型的 xff0c 拷贝构造和赋值函数调用 对自定义类型使用STL algorithm中的swap函数 xff0c 会调用自定义的类型的拷贝构造函数一次 赋值函数两次 xff1b 自定义类型中没有定义那么就会
  • C++11之POD类型

    什么是POD类型 POD的全称叫做Plain Old Data xff0c 简单讲就是一个类或者一个结构体通过二进制拷贝之后还能保持其不变 xff0c 那么这个类型就是POD类型 什么类型属于POD类型 当一个类型具有平凡的定义和标准布局这