assert在debug 和 release版本中的区别

2023-11-01

转自:https://blog.csdn.net/panfengsoftware/article/details/8910468

debug版本与release的不同点:

debug版本中含有调试信息,不会对程序进行优化,assert相应的宏会被执行。
release版本中不含有调试信息,会对程序进行优化,assert相应的宏不会被执行。

#来自http://community.csdn.net/Expert/topic/4342/4342874.xml?temp=.2288935

当构造一个应用程序的时候,应该始终记住:应该让程序在出现bug或非预期的错误的时候,应该让程序尽可能早地突然死亡。这样做可以帮助你在开发——测试循环中尽早地发现错误。不导致突然死亡的错误将很难被发现;它们通常会被忽略,直到程序在客户系统中运行以后才被注意到。
    检查非预期状态的最简单的方式是通过标准C库的assert宏。这个宏的参数是一个布尔表达式(Boolean expression)。当表达式的值为假的时候,assert会输出源文件名、出错行数和表达式的字面内容,然后导致程序退出。Assert宏可用于大量程序内部需要一致性检查的场合。例如,可以用assert检查程序参数的合法性、检查函数(或C++中的类方法)的前提条件和最终状态(postcondition)、检查非预期的函数返回值,等等。
    每次使用assert宏,不仅可以作为一项运行期的检查,还可以被当作是嵌入代码中的文档,用于指明程序的行为。如果你的程序中包含了assert( condition ),它就是在告诉阅读代码的人:condition在这里应该始终成立;否则很可能是程序中的bug。
    对于效率至上的代码,assert这样的运行时检查可能引入严重的效率损失。在这种情况下,你可以定义NDEBUG宏并重新编译源码(可以通过在编译器参数中添加 –DNDEBUG参数做到)。在这种情况下,assert宏的内容将被预处理器清除掉。应该只在当效率必须优先考虑的情况下,对包含效率至上的代码的文件设置NDEBUG宏进行编译。
    因为assert可能被预处理过程清除,当使用这个宏的时候必须确信条件表达式不存在副作用。特别的,不应该在assert的条件表达式中使用这些语句:函数调用、对变量赋值、使用修改变量的操作符(如 ++ 等)。

    例如,假设你在一个循环中重复调用函数do_something。这个函数在成功的情况下返回0,失败则返回非0值。但是你完全不期望它在程序中出现失败的情况。你可能会想这样写:
for (i = 0; i < 100; ++i)
  assert (do_something () == 0);

    不过,你可能发现这个运行时检查引入了不可承受的性能损失,并因此决定稍候指定NDEBUG以禁用运行时检测。这样做的结果是整个对assert的调用会被完全删除,也就是说,assert宏的条件表达式将永远不会被执行,do_something一次也不会被调用。因此,这样写才是正确的:
for (i = 0; i < 100; ++i) {
  int status = do_something ();
  assert (status == 0);
}

    另外一个需要记住的是,不应该使用assert去检测不合法的用户输入。用户即使在输入不合适的信息后也不希望看到程序仅在输出一些含义模糊的错误信息后崩溃。你应该检查用户的非法输入并向用户返回可以理解的错误信息。只当进行程序内部的运行时检查时才应使用assert宏。
    一些建议使用assert宏的地方:
    &#8226; 检查函数参数的合法性,例如判断是否为NULL指针。由 { assert (pointer != NULL)} 得到的错误输出
    Assertion ‘pointer != ((void *)0)’ failed.
    与当程序因对NULL指针解引用得到的错误信息
    Segmentation fault (core dumped)
    相比而言要清晰得多。

    &#8226; 检查函数参数的值。例如,当一个函数的foo参数必须为正数的时候我们可以在函数开始处进行这样的检查:
    assert (foo > 0);
    这会帮助你发现错误的调用;同时它很清楚地告诉了读代码的人:这个函数对参数的值有特殊的要求。

    不要就此退缩;在你的程序中适当地时候使用assert宏吧。

www.AdvancedLinuxProgramming.com
英文版版权归原作者
完美废人 翻译

*****************************************************************************************************************

转载:http://blog.csdn.net/yeyuboy/article/details/593736

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

assert在debug 和 release版本中的区别 的相关文章

  • TNN行业首发Arm 32位 FP16指令加速,理论性能翻倍

    转自 https cloud tencent com developer article 1774206 https www cnblogs com zhangshenghui p 11825760 html FP16是半精度浮点格式 相比
  • Android中Acition和Category常量表

    Action Action常量 对应字符串 简单说明 ACTION MAIN android intent action MAIN 应用程序入口 ACTION VIEW android intent action VIEW 显示指定数据 A
  • assert在debug 和 release版本中的区别

    转自 https blog csdn net panfengsoftware article details 8910468 debug版本与release的不同点 debug版本中含有调试信息 不会对程序进行优化 assert相应的宏会被
  • Tensorflow的Bazel编程(二)

    转自 http blog csdn net langb2014 article details 54312697 安装官网 https bazel build versions master docs tutorial Java html
  • Android-打包AAR步骤以及最为关键的注意事项

    转自 https www jianshu com p f391d0a6691e 简介 最近因为项目的要求 需要把开发的模块打包成aar 供其他项目调用 在搞了一段时间后 发现这里还是有很多需要注意的地方 所以记录一下 帮助大家不要走弯路 首
  • Android系统运动传感器

    转自 https blog csdn net liang123l article details 53992197 Android平台提供了多种感应器 让你监控设备的运动 传感器的架构因传感器类型而异 重力 线性加速度 旋转矢量 重要运动
  • android studio 安装说明

    转自 http www cnblogs com liuhongfeng archive 2015 12 30 5084896 html 1 下载android studio 含SDK版本 http www android studio or
  • 纯手工gcc 编译android native Cpp代码

    纯手工gcc 编译android native Cpp代码 api level 19 32位 编译成功 api level 19 home charlie android tool android ndk r10e toolchains a
  • 解决camera1 onPreviewFrame()会阻塞UI线程

    转自 https blog csdn net qq 31939617 article details 86360335 https www huaweicloud com zhishi arc 13664997 html 注意 onPrev
  • 各国语言对应翻译表

    为了工作方便 自己做了一个地区语言的英文翻译 让自己可以更快的找到自己需要的地方 同时 分享给大家 谢谢 中文 各国语言 翻译 序号 中文 翻译 1 阿尔巴尼亚语 2 阿拉伯语 3 阿姆哈拉语 4 阿塞拜疆语 Az rbaycan 5 爱尔
  • Android:手把手带你了解实用的Android Jetpack

    转自 https blog csdn net carson ho article details 104243841 前言 在2018年 Google I O 大会上发布了一系列辅助Android开发者开发的实用工具集合 Jetpack 今
  • Nv21转Bitmap(高效率转化)

    转自 https blog csdn net qq1137830424 article details 81980673 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 ht
  • java static 静态方法的使用 注意事项

    定义为 static function1 function1 中不能引用this或super 在android 中这样用的话 会出现以下的报错 W dalvikvm 2783 JNI WARNING instance fieldID 0x5
  • Android性能调优工具TraceView介绍

    转自 http www trinea cn android android traceview 本文主要介绍Android性能调优工具TraceView的使用及通过其确定性能点 目前性能优化专题已完成以下部分 性能优化总纲 性能问题及性能调
  • 在Android Studio中下载Android SDK的两种方式(第二种好用)

    转自 https www cnblogs com mxj961116 p 10423479 html Android studio下载地址 http www android studio org 方式一 设置HTTP Proxy1 打开Se
  • Android数据的四种存储方式SharedPreferences、SQLite、ContenProvider

    作为一个完整的应用程序 数据存储操作是必不可少的 因此 Android系统一共提供了四种数据存储方式 分别是 SharePreference SQLite Content Provider File 由于Android系统中 数据基本都是私
  • Android开发使用OpenCv中JavaCameraView预览图左旋90度问题

    转自 https blog csdn net yd yandong article details 52698696 本文参考地址 http stackoverflow com questions 14816166 rotate camer
  • Java反射机制的学习

    转自 http www cnblogs com keis archive 2011 03 29 1998736 html Java反射机制是Java语言被视为准动态语言的关键性质 Java反射机制的核心就是允许在运行时通过Java Refl
  • Android APP应用启动页白屏(StartingWindow)优化

    转自 https www cnblogs com whycxb p 9312914 html 本人采用这种方法没有效果 启动图片出来第一帧 我应用的第一帧也出来了 启动背景颜色没有调试出来 Theme AppCompat Light Dar
  • android 反射机制和反射调用方法

    对于android 中很多类没有开放出来 考虑到这些API不稳定 后续有可能会更改 所有没有在SDK中暴露出来给用户使用 但是我们在开放的过程中还是需要使用到一些android 系统中未开放出来的class 这时候我们就可以通过反射机制来调

随机推荐

  • 计算机网络篇-运输层

    运输层 运输层向上层应用层提供通信服务 运输层是端到端的通信 也就是说通信的两端是两个主机中的应用进程 运输层还有一个很重要的功能 分用 复用 运输层的两个主要协议 用户数据报协议UDP 不需要建立连接 传输控制协议TCP 提供面向连接的服
  • AngularJS自动化测试之karma+jasmine单元测试

    单元测试专门用于测试小型 独立的代码单元 单个函数 或者较小的功能 其主要难点在于划分小的功能块 本位主要介绍AngularJS的单元测试的环境搭建 Karma是一个基于Node js的JavaScript测试执行过程管理工具 Test R
  • C++实现【获取鼠标位置】以及控制鼠标【打开窗口并点击】

    获取鼠标位置的函数源代码来自 C 认知系列 实时获取鼠标坐标 c 获取鼠标坐标 Zalamp的博客 CSDN博客 鼠标点击操作代码来自 C 控制鼠标移动到指定位置并且左键点击 c 鼠标移动 蜚语77的博客 CSDN博客 在特定程序中实现鼠标
  • Python 合并同一文件夹下所有Excel_xlsx文件

    转载 How to Consolidate Multiple Excel Workbooks With Python 想要将同一文件夹下xlsx文件合并为一个文件 代码 代码来源 仅供学习 import pandas as pd impor
  • Windows域认证(Kerberos认证)图解

    图文经过梳理与绘制已较为详细 希望能帮助大家更清晰 直观地了解Kerberos的认证过程 相关名词 DC 域控制器 KDC 密钥分发中心 AD 账户数据库 AS 身份验证服务 TGS 票据发放服务 TGT 认证票据 Ticket 票据 Ma
  • VOS论文阅读:Fast Video Object Segmentation using the Global Context Module(2020 ECCV)

    Fast Video Object Segmentation using the Global Context Module 2020 ECCV Contribution Method Global Context Module Conte
  • redis 数据类型之字符串(string) 详细介绍

    字符串 string 键是Redis最基本的键值对类型 这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来 被关联的键和值既可以是普通的文字数据 也可以是图片 视频 音频 压缩文件等更为复杂的二进制数据 图2 1展示了数据库视
  • openwrt 完美安装 tcpdump

    直接使用 opk install tcpdump 报下面的错 Collected errors check data file clashes Package libpcap1 wants to install file usr lib l
  • Makeflow用户手册 一

    Makeflow用户手册 概述 Makeflow是用于大规模分布式计算的工作流引擎 它接受要执行的大量工作的规范 并尽可能在远程计算机上并行运行 此外 Makeflow是容错的 因此您可以使用它来协调非常大的任务 这些任务可能在出现故障时运
  • (4)各个属性角色分析显示-4

    将折线图 数据集 散点图集合在一个html文件中 1 将折线图 数据集 散点图设置为函数a b c 2 再调用page add 函数 将三个图片组合在一起 3 运行page render x html 函数 将该页面命名 打开html文件
  • Java线程中处理运行时异常(UncaughtExceptionHandler)

    线程在执行单元中不允许抛出checked异常 而且线程运行在自己的上下文中 派生它的线程无法直接获得它运行中出现的异常信息 对此 Java为我们提供了UncaughtExceptionHandler接口 当线程在运行过程中出现异常时 会回调
  • ElasticSearch多字段查询best_fields、most_fields和cross_fields理解

    基于elasticsearch7 6 1 和 kibana7 6 1 本文通过案例进行讲解 希望读者耐心阅读 一 介绍 字段中心查询式 就是以字段为中心 代表就是 best fields和most fields 把所有的字段全都散列 然后从
  • 详解曼哈顿距离&欧式距离&切比雪夫距离

    详解曼哈顿 欧式距离 切比雪夫距离 曼哈顿距离 基本概念 出租车几何或曼哈顿距离 Manhattan Distance 是由十九世纪的赫尔曼 闵可夫斯基所创词汇 是种使用在几何度量空间的几何学用语 用以标明两个点在标准坐标系上的绝对轴距总和
  • 基于32单片机的16通道ADC的数据采集

    基于32单片机的16通道ADC的数据采集 这个部分的内容 是作为外部模拟量部分的采集工作 按照任务要求 所设计的方案 需要完成以下指标 ADC必须能采集16通道的模拟量 ADC的分辨率是16bit 采样率不小于20khz 由此分析可以得出
  • 请使用正确的入口登录面板—解决方案

    错误信息提示 解决方案 一 找回安全登录地址 宝塔登录地址 http 你的服务器ip 8888 但是这种格式是不安全的 目前新安装的宝塔面板默认都开启了安全目录登录 所以如果使用这种不带有8位字符随机码的登录地址就会提示 请使用正确的入口登
  • 【AI】《动手学-深度学习-PyTorch版》笔记(二十一):目标检测

    AI学习目录汇总 1 简述 通过前面的学习 已经了解了图像分类模型的原理及实现 图像分类是假定图像中只有一个目标 算法上是对整个图像做的分类 下面我们来学习 目标检测 即从一张图像中找出需要的目标 并标记出位置 2 边界框 边界框 boun
  • xctf攻防世界—Web新手练习区robots单题思路

    xctf攻防世界 Web新手练习区robots单题思路 邱邱邱自强 前言 随着互联网的发展 互联网界的行为也越来越被重视 那么国际互联网界通行的道德规范是什么呢 它就是Robots协议 一 Robots协议是什么 robots协议也叫rob
  • 点击Path环境变量编辑不展开的问题

    分析 将 MYSQL HOME bin移动到 JAVA HOME bin的上面 点击确定 再次点击Path环境变量就会出现编辑不展开的问题 如图所示 分析原因 因为我把两个 MYSQL HOME bin和 JAVA HOME bin一起放在
  • zip、unzip命令使用

    1 zip压缩命令 1 压缩文件 zip test test txt 将text txt文件压缩到test zip文件中 2 压缩文件夹 r zip r attack zip attack 将当前路径下attack文件夹中的文件进行压缩 压
  • assert在debug 和 release版本中的区别

    转自 https blog csdn net panfengsoftware article details 8910468 debug版本与release的不同点 debug版本中含有调试信息 不会对程序进行优化 assert相应的宏会被