【1】trivial意思是无意义,这个trivial和non-trivial是对类的四种函数来说的:
        构造函数(ctor)
        复制构造函数(copy)
        赋值函数(assignment)
        析构函数(dtor)
如果至少满足下面3条里的一条:
       显式(explict)定义了这四种函数。
       类里有非静态非POD的数据成员。
       有基类。
       那么上面的四种函数是non-trivial函数,比如叫non-trivial ctor、non-trivial copy…,也就是说有意义的函数,里面有一下必要的操作,比如类成员的初始化,释放内存等。

【2】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算法最基本的想法是这样的:

//当然实际的copy比这个复杂多了,有非常多的特化等,这个只是一个简化示例
// 非POD重载指针数值
template <</span>class T> void copy(T* source, T* destination, int n, __false_type)
{// 省略异常处理for (; n > 0; n--,source++,destination++){// 调用source的复制构造函数constructor(source, *destination);}
}
// POD重载指针数值
template <</span>class T> void copy(T* source, T* destination, int n, __false_type)
{// 省略异常处理memmove(source, destination, n);
}

【3】

示例代码:
class Test
{
int* p;
}
这时析构函数就不能是trivial的,因为它必须把p申请的内存释放掉!
而如果
class Test
{
int p;
}
析构函数可以什么也不做,就是trivial的。
nontrivial需要你自己负责处理的一些问题,诸如内存的释放。因为编译器产生的析构函数
只是满足编译器的需要,而不是程序的需要。所以对于程序所需要的功能,需要你自己来处理。

C++程序员应了解的那些事(19)C++ trivial(平凡的)和non-trivial(非平凡的)相关推荐

  1. 程序员应了解的那些事(107)之图灵完备

    目录 什么是图灵机 图灵机的结构包括以下几个部分: 图灵机结构 图灵机可以解决什么问题 什么是图灵完备(对图灵完备的描述) Brainfuck 语言:直观理解图灵完备 图灵机的组成(附) 图灵完备是对 ...

  2. C++程序员应了解的那些事(103)发生死锁必须满足四个条件:互斥条件/请求与保持条件/不剥夺条件/循环等待条件

    要想发生死锁有 4 个缺一不可的必要条件: 第 1 个叫互斥条件,它的意思是每个资源每次只能被一个线程(或进程,下同)使用,为什么资源不能同时被多个线程或进程使用呢?这是因为如果每个人都可以拿到想要的 ...

  3. C++程序员应了解的那些事(116)~单引号 VS 双引号

    目录 一.简述单引号和双引号 二.知识点拔-1 三.程序实例分析Step-1 四.程序实例分析Step-2 五.错误示例:字符和字符串混淆 六.知识点拔-2 一.简述单引号和双引号 C语言中的单引号用 ...

  4. 程序员应了解的那些事(4)求递归算法的时间复杂度

    (一)递归树法 <1>计算递归式T(n)=2T(n/2)+n^2的时间复杂度.        考虑递归式:        T(n)=2T(n/2)+n^2        可将其化为:   ...

  5. 嵌入式程序员应知道的基本问题-C语言(zz)

    来源:21ICbbs  作者:lhf C语言测试:想成为嵌入式程序员应知道的0x10个基本问题 其中少量灰色的文字是我添加的,表达一些我的看法,很不成熟,希望朋友们指正. C语言测试是招聘嵌入式系统程 ...

  6. 程序员应知——学习、思考与分享

    有人说,程序员是个苦差事,一辈子总是要不停地学习,学习新的技术,学习新的架构,学习新的工具,一旦一段时间不学习,就会发现其他人嘴里冒出来的新鲜词,自己已经搞不懂是什么了. 的确,作为程序员,学习很重要 ...

  7. 程序员应学习蜡笔小新的心态

    程序员应学习蜡笔小新的心态,今天的仔细看了看的蜡笔小新,然后放在拖布上,车门打开了,我和妈妈回到家后,唐门是一个非常酷,因为我知道此时无声胜有声,里面一棵棵缀满彩色电灯的大枞树闪着奇异的光彩,仔细看了 ...

  8. php程序员应具有的7种能力

    php程序员应具有什么样的能力,才能更好的完成工作,才会有更好的发展方向呢?在中国我想您不会写一辈子代码的,那样不可能,过了黄金期,您又怎么办呢?看了本文后,希望对您有所帮助. 一,php能力 1,了 ...

  9. 程序员应该知道的一二事(4)

    程序员应该知道的一二事 科普 开源 脚本 脚本语言和编程语言的区别是什么? 组成原理 先定义后赋值的理由 网络原理 五层 科普 开源 开源即开放源代码. 开放源代码(Open source code) ...

  10. 转载:程序员应知——团队精神

    转载:http://blog.csdn.net/lingyun2005/archive/2010/08/09/5797890.aspx 程序员应知--团队精神     写在前面:前几天终于看完了< ...

最新文章

  1. iOS SwiftUI篇-3 排版布局layout
  2. ​万字总结83篇文献:深度强化学习之炒作、反思、回归本源
  3. python零基础入门教材-python如何零基础学习,如何入好门?
  4. 用java实现计算器加减乘除功能,并能够循环接收新的数据,通过用户交互实现
  5. UBoot讲解和实践-----------讲解(一)
  6. 服务器安全证书更新失败怎么回事,手机安全证书更新失败怎么回事
  7. datetimepicker 更新值无效_文献阅读之Voronoi图的生成与更新
  8. 阐述Spring框架中Bean的生命周期?
  9. 在Realview MDK中添加自己的FLASH编程算法
  10. html编写学生注册表,IT之家网友分享:如何自己编写一个注册表文档
  11. 个税计算公式excel_财务不会做工资表?全函数统计查询、自动个税计算模板送你,给力...
  12. HTML字体转为大写,css字体属性和英文大小写转换
  13. 【故事】《阿里云的这群疯子》:深度好文阅读推荐
  14. 玩转f#的一个实例——解拼图游戏
  15. php微信公众号支付实例教程,PHP微信公众号支付教程(含图文)
  16. ESP32-C3入门教程 基础篇(八、NVS — 非易失性存储库的使用)
  17. python视频转字符动画_python字符动画
  18. 1月第1周榜单丨B站UP主排行榜(飞瓜数据B站)发布!
  19. uCLinux简介--
  20. 老师就是学生的天-- 恩人意识,青天意识从娃娃抓起

热门文章

  1. 如何使用bibtex插入参考文献(基于WinEdit)
  2. math.floor java_Java Math floor、ceil、rint 及 round 用法
  3. php判断floor,php floor()函数
  4. 本地静态网页上传到服务器
  5. 搜索与问答——【NeurIPS 2021】BEIR:信息检索模型零样本评估的异构基准
  6. 2429: [HAOI2006]聪明的猴子
  7. 求1加到n的发散思维方法
  8. (DINO) Emerging Properties in Self-Supervised Vision Transformers——自监督ViT的新属性和几点思考
  9. 怎样批量替换Word中的文字?这一招Word文字替换技巧你会吗
  10. 高质量程序设计指南(笔记)