今天看书看到侯捷的《STL源码剖析》里提到trivial和non-trivial及POD类型,查了些资料理解了一下。

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

  • 构造函数(ctor)
  • 复制构造函数(copy)
  • 赋值函数(assignment)
  • 析构函数(dtor)

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

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

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

那个POD意思是Plain Old Data,也就是C++的内建类型或传统的C结构体类型。POD类型必然有trivial ctor/dtor/copy/assignment四种函数。

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

那这有什么用处呢?

如果这个类都是trivial ctor/dtor/copy/assignment函数,我们对这个类进行构造、析构、拷贝和赋值时可以采用最有效率的方法,不调用无所事事正真的那些ctor/dtor等,而直接采用内存操作如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比这个复杂多了,有非常多的特化等,这个只是其中一方面而已。

此条目是由 波波发表在 编程分类目录的。将 固定链接加入收藏夹。

《C++ TRIVIAL和NON-TRIVIAL构造函数及POD类型》上有1条评论

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

  1. C++ trivial和non-trivial构造函数及POD类型(转)

    原博客地址http://blog.csdn.net/a627088424/article/details/48595525 最近正纠结这个问题就转过来了,做了点补充(参考<深度探索C++对象模型 ...

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

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

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

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

  4. C++11 POD 类型

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

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

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

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

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

  7. C++11 POD类型

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

  8. c++中的pod类型

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

  9. C++11的POD类型

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

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

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

最新文章

  1. (软件工程复习核心重点)第十章面向对象设计-第五节:设计数据管理子系统和设计类中的服务
  2. 【Nginx】第一章 快速入门
  3. nginx ngx_core_module(main event)
  4. WebKit技术内幕(笔记)
  5. 为vc工程添加Unicode Debug和Unicode Release
  6. 从0开始学习 GitHub 系列之「向GitHub 提交代码」
  7. 十段均衡器开源 android,十段均衡器最美人声(10段均衡器最清晰人声)
  8. android javacv,【首发】AndroidStudio配置JavaCV环境
  9. 微波和射频信号的区别是什么?两者的信号发生器该如何选择?
  10. Kent Beck简单设计四条规则
  11. 众人逃离北上广后又逃回:观念不合拍还要拼爹
  12. cs python课程 加州大学_如何看待Berkeley开设的CS61A:SICP in Python课程?
  13. 网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业
  14. 硬盘数据丢失了怎么恢复?数据恢复对策在这
  15. oracle、MySQL日期转XX年XX月XX日日期格式和金钱转中文大写数字的方法
  16. Java遍历目录下的所有文件
  17. mysql如何重复数据合并_mysql合并重复数据
  18. 谷歌翻译影响vue_给自己的网站接入谷歌翻译,以及修复了一个谷歌翻译的一个bug...
  19. java导出pdf格式文档
  20. UCOSii的任务切换

热门文章

  1. wordpress漏洞工具_打击WordPress中的垃圾评论的12个重要提示和工具
  2. 实战剖析:13步设计出一个ITSM系统
  3. flutter floor数据库框架使用
  4. 织梦dede列表分页样式
  5. 科技如何激发女权主义并改变男性气质
  6. 分级基金下折套利风险介绍
  7. DINO Emerging Properties in Self-Supervised Vision Transformers 论文阅读
  8. flappy brid
  9. 计算机安全群,大开眼界||斯坦福大学信息安全课程群
  10. 梦三花重金修改服务器,3月6日一梦江湖游戏更新公告