【C++11】POD数据类型

啥是POD类型?

POD全称Plain Old Data。通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。

平凡的定义

1.有平凡的构造函数

2.有平凡的拷贝构造函数

3.有平凡的移动构造函数

4.有平凡的拷贝赋值运算符

5.有平凡的移动赋值运算符

6.有平凡的析构函数

7.不能包含虚函数

8.不能包含虚基类

#include "stdafx.h"
#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 _tmain(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;
}

运行结果

标准布局的定义

1.所有非静态成员有相同的访问权限

2.继承树中最多只能有一个类有非静态数据成员

3.子类的第一个非静态成员不可以是基类类型

4.没有虚函数

5.没有虚基类

6.所有非静态成员都符合标准布局类型

#include "stdafx.h"
#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数据。可以通过std::is_pod来判断一个类型是否为POD类型。

如文章开头说的,一个POD类型是可以进行二进制拷贝的,看看下面的例子。

#include "stdafx.h"
#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类型进行二进制拷贝后,数据都成功的迁移过来了。

【C++11】POD数据类型

时间: 2024-12-29 06:59:37

【C++11】POD数据类型的相关文章

c++11 pod类型(了解)

啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型. 平凡的定义 1.有平凡的构造函数 2.有平凡的拷贝构造函数 3.有平凡的移动构造函数 4.有平凡的拷贝赋值运算符 5.有平凡的移动赋值运算符 6.有平凡的析构函数 7.不能包含虚函数 8.不能包含虚基类 [cpp] view plaincopy在CODE上查看代码片派生到我的代码片 #include "stdafx.h" #include &

&lt;C++学习四&gt;C++11基本数据类型

本文记录C++11的一些基本数据类型,方便以后查阅. (1)C++03的基本数据类型: 类型 含义 最小存储空间 bool 布尔值 未定义 char 字符型 8字节 wchar 宽字符 16字节 short 短整型 16字节 int  整型 16字节 long 长整型 32字节 float 单精度浮点数 6位数精度 double 双精度浮点数 10位数精度 long double 更高精度浮点数 10位数精度 (2)C++11新定义数据类型: 类型 含义 最小存储空间 char16_t Unic

《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?

原创文章,欢迎转载.转载请注明:关东升的博客    在我们学习语言时都会学到这种语言的数据类型,在Swift中数据类型有那些呢?整型.浮点型.布尔型.字符.字符串这些类型是一定有的,其中集合.枚举.结构体.类也是Swift中的数据类型.元组是Swift中特有的. 其他那些类型我们可能多少知道些或是听说过.元组是在Swift中有的,它是什么呢? 它是一种数据结构,在数学中应用广泛.在计算机科学中,元组是关系数据库中的基本概念,元组表中的一条记录,每列就是一个字段.因此在二维表里,元组也称为记录.

Swift 2.0学习笔记(Day 11)——数据类型那些事儿?

?? 原创文章,欢迎转载.转载请注明:关东升的博客    在我们学习语言时都会学到这种语言的数据类型,在Swift中数据类型有那些呢?整型.浮点型.布尔型.字符.字符串这些类型是一定有的,其中集合.枚举.结构体.类也是Swift中的数据类型.元组是Swift中特有的. 其他那些类型我们可能多少知道些或是听说过.元组是在Swift中有的,它是什么呢? 它是一种数据结构,在数学中应用广泛.在计算机科学中,元组是关系数据库中的基本概念,元组表中的一条记录,每列就是一个字段.因此在二维表里,元组也称为记

[Objective-c 基础 - 2.11] SEL数据类型

A.概念 1.SEL类型代表方法 2.每个方法都有一个对应的SEL类型的数据 3.实例对象调用方法 (1)编译器会把类的方法包装成SEL类型的数据, (2)根据SEL数据找到方法地址,缓存此地址 (3)根据方法地址调用相应的方法 4.调用方法的方式 1 // 1.直接调用 2 [p test2]; 3 // 2.使用@selector 4 [p performSelector:@selector(test2)]; 5 // 3.使用@selector调用带参数的方法 6 [p performSe

第05章 mysql 数据类型

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Chapter 11 Data Types [6] Mysql支持的数据类型(总

JS(数据类型、预解析、闭包、作用域、this)

1.数据类型的区别 基本数据类型:number.string.boolean.null.undefined 引用数据类型: 1-1:对象数据类型:Object.Array.Date.Regexp.String.Boolean等 1-2:函数数据类型function2.预解析(变量提升) 在当前作用域中.JS从上到下执行.首先把带var和function关键字的进行声明和定义 2-1:声明(declare):var num = 12; 在预解释状态为 var num = undefined; 2-

python开发mysql:mysql数据类型&amp;约束条件

一 整形 1 只有Int类型跟存储没有关系,显示的是宽度,其他类型都是限制 2 整形类型:[(m)][unsigned][zerofill] 3 作用:存储年龄,等级,id,各种号码 4 m,代表显示宽度 默认11 其他数据类型标识的就是几个字节,限制几个字节 5 unsigned,代表 限制没有字符 6 zerofill,代表 宽度显示不够,用0补全 7 8 1 整数数字 默认有符号 9 tinyint(1个字节),int(4个字节),bigint(8个字节):注意一下,约束条件和范围 10

SQL数据类型介绍

在计算机中数据有两种特征:类型和长度.所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类.    在SQL Server 中每个变量.参数.表达式等都有数据类型.系统提供的数据类型分为几大类,如表4-2 所示. 其中,BIGINT. SQL_VARIANT 和TABLE 是SQL Server 2000 中新增加的3 种数据类型.下面分类讲述各种数据类型. 4.3.1 整数数据类型     整数数据类型是最常用的数据类型之一.     1.INT (INTEGER)INT (或INTE