原博客地址http://blog.csdn.net/a627088424/article/details/48595525

最近正纠结这个问题就转过来了,做了点补充(参考《深度探索C++对象模型》)

trivial意思是无意义,这个trivial和non-trivial是对类的四种函数来说的:

  • 默认构造函数(default constructor)
  • 拷贝构造函数(copy constructor)
  • 赋值函数(copy assignment operator)
  • 析构函数(destructor)

如果至少满足下面3条里的一条:

  1. 显式(explict)定义了这四种函数。
  2. 类里有非静态非POD的数据成员。
  3. 有基类。

那么上面的四种函数是non-trivial函数,比如叫non-trivial constructor、non-trivial copy constructor…,也就是说有意义的函数,里面有以下必要的操作,比如类成员的初始化,释放内存等。

POD意思是Plain Old Data,也就是C++的内建类型或传统的C结构体类型(C风格的struct结构体定义的数据结构)。POD类型必然有trivial constructor/ destructor/ copy constructor / copy assignment operator四种函数。

//整个T是POD类型
class T { //没有显式定义ctor/dtor/copy/assignemt所以都是trivial int a; //POD类型 }; //整个T1是非POD类型 class T1 { T1() //显式定义了构造函数,所以是non-trivial ctor {} //没有显式定义ctor/dtor/copy/assignemt所以都是trivial int a;//POD类型 std::string b; //非POD类型 };

那这有什么用处呢?

如果这个类都是constructor/ destructor/ copy constructor / copy assignment operator函数,我们对这个类进行构造、析构、拷贝和赋值时可以采用最有效率的方法,不调用无所事事正真的那些consructor/destructor等,而直接采用内存操作如malloc()、memcpy()等提高性能,这也是SGI STL内部干的事情。

比如STL的copy算法最基本的想法是这样的:

// 非POD重载指针数值
template <class T> void copy(T* source, T* destination, int n, __false_type) { // 省略异常处理 for (; n > 0; n--,source++,destination++) { // 调用source的复制构造函数 constructor(source, *destination); } } // POD重载指针数值 template <class T> void copy(T* source, T* destination, int n, __false_type) { // 省略异常处理 memmove(source, destination, n); }

当然实际的copy比这个复杂多了,有非常多的特化等,这个只是其中一方面而已。

转载于:https://www.cnblogs.com/gwtfighter/p/5499534.html

C++ trivial和non-trivial构造函数及POD类型(转)相关推荐

  1. C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型

    在侯捷的<STL源码剖析>里提到trivial和non-trivial及POD类型,相关知识整理如下. trivial意思是无意义,这个trivial和non-trivial是对类的四种函 ...

  2. C ++中的POD类型是什么?

    我有几次遇到这个术语POD型. 这是什么意思? #1楼 POD代表普通旧数据 - 即没有构造函数,析构函数和虚拟成员函数的类(无论是使用关键字struct还是关键字class ). 维基百科关于POD ...

  3. C++11 POD 类型

    POD(Plain Old Data,普通旧数据)类型是从 C++11 开始引入的概念,Plain 代表一个对象是一个普通类型,Old 代表一个对象可以与 C 兼容.通俗地讲,一个类.结构.共用体对象 ...

  4. C++11新特性之POD类型

    POD(Plain Old Data)是C++中非常重要的一个概念,用来描述一个类型的属性其中Plain表示这个类型是个平凡的类型,Old表示其与C的兼容性.C++11中将POD划分为两个基本概念:平 ...

  5. 【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践

    深度解析C++中的POD类型:从理论基础到项目实践 1. C++中的POD类型(Plain Old Data) 1.1 POD类型的定义和特性 Trivial类型 Standard layout类型 ...

  6. C++11 POD类型

    POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作.C++11中把POD分为了两个基本概念的集合 ...

  7. c++中的pod类型

    最早看到POD(plain old data)类型,是在imperfect c++里.我觉得这是一本把我带到c++世界里的一本很重要的书. 书里是这样解释POD的: 1.   所有标量类型(基本类型和 ...

  8. C++11的POD类型

    POD类型的定义 必须是平凡的和有标准布局的. 平凡的构造函数与析构函数是默认的,不起任何作用的.如果自定义了,那么需要声明为default类型的. 使用std::is_trivial进行判别. 标准 ...

  9. C/C++编程:POD类型

    概叙 很久之前,C语言统一了江湖,几乎所有的系统底层都是用C写的,当时定义大的基本数据类型类型有 int.char.float 等整数类型.浮点类型.枚举.void.指针.数组.结构等等.然后只要碰到 ...

最新文章

  1. 《庆余年》值得一看吗?Python告诉你谁在关注 | CSDN原力计划
  2. 两个List合并去重
  3. linux下.rar的文件,Linux下.rar压缩文件处理 (RAR 4.11 for linux )
  4. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)
  5. MyBatis的功能架构是怎样的
  6. 【ORACLE 高可用】使用GOLDENGATE 配置Oracle-MySQL的异构复制
  7. Ubuntu 安装 cuda 时卡在登录界面(login loop)的解决方案之一
  8. 【OCP|052】OCP题库更新,052最新考题及答案整理-第10题
  9. AlbertTransformerEncoder
  10. 中国气象局所有城市代码
  11. Excel 2016添加复选框
  12. 华为3Com总裁郑树生:我们最终要自立门户
  13. zkw线段树(详解)
  14. 芯片破解、解密方法介绍
  15. 计算机语言怎么学,教你如何学习计算机编程语言
  16. Turing Tape (推公式 模拟)
  17. 音调、响度 和 周期(频率) 占空比 的关系
  18. Linux环境下安装python并编写简单程序
  19. wish - 简单的窗口式(windowing) shell
  20. simulink 脱离 matlab,Simulink软件不能脱离MATLAB环境而运行

热门文章

  1. MFC线程优先级程序图示
  2. Java 时间日期整理
  3. Redis系列四:redis支持的数据类型
  4. NSPredicate的用法
  5. AbsoluteLayout 相框
  6. 在.m中的@interface (原创)
  7. Razor语法(一)
  8. AVG Anti-Spyware 7.5 .0.50(原EWIDO)汉化 破解 注册 序列号
  9. C#实现javascript的escape
  10. 用神经网络分类水和乙醇