让人崩溃的微软Release编译优化

             搞了几年的编程,一直都在使用try...catch语句,却从来没想到,原来这些语句都是白用了。

       最近做了一个项目,需要根据try...catch是否捕获到异常来作出选择,执行不同的操作。在Debug下执行一切正常,有异常的时候也能够捕获到,从而选择正确的路径执行,但是编译成Release版后有异常时始终不能捕获到,致使执行出错,找了好久也没找出是什么原因。

       后来上网搜索才发现,原来问题出在微软的VC编译器的优化上:在Debug下代码未进行优化,所以没有问题,异常会被捕获。但在Release方式下如果选择default,不进行代码优化,则不会出错,但是代码的速度,效率和尺寸都比较差了,如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,try语句中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
        这个优化功能太整人了,本来写了这个语句就是感觉可能会出现异常,需要捕获异常的,结果发布时却给你优化掉了,导致错误,让人花费多少时间来查找错误的原因。

        要解决这个问题,只要在C++编译命令行中加入 /EHa 的参数,这样VC编译器就不会把try...catch模块给优化掉了。

### 回答1: CMake是一个跨平台的构建工具,可用于创建、测试和打包C++代码项目。在CMake中,release编译是指构建一个用于发布的版本,它会对代码进行优化以提高执行速度和减少二进制文件的大小。 与debug编译相比,release编译关注的是代码的运行和执行效率。为了使代码更快地运行,release编译对代码进行了优化,例如去除代码中没有使用的部分,减少代码中的重复计算等。这些优化可以大大提高代码的运行速度和执行效率。 另外,release编译还会生成可以直接发布的二进制文件,它们没有debug信息和其他调试工具,因此文件的大小也会减少。这些二进制文件通常比debug版本的快速执行,因为它们包含更少的调试代码和其他元数据。 总之,release编译的目标是创建一个性能更好、文件更小的产品版本,可供最终用户使用。因此,在编译代码时,开发人员应该仔细选择构建目标,以便最大化代码性能和效率。 ### 回答2: CMake是一种跨平台的开源构建自动化工具,它可以帮助程序员管理C++的编译、依赖、链接、测试等方面的问题。Release编译是指在发布产品的时候进行的编译操作,目的是生成可执行的、优化过的、没有调试信息的程序,以提高产品的性能和安全性。 要进行CMake Release编译,需要在CMake中进行一些配置和设置。下面是具体的步骤: 1. 在CMakeLists.txt文件中添加编译选项:在CMakeLists.txt文件中添加set(CMAKE_BUILD_TYPE "Release"),这会告诉CMake编译器使用Release模式来进行编译,以优化程序性能。 2. 清空已有的编译文件:在编译Release版本之前应该先清空已有的编译文件。在命令行中进入项目目录后,输入rm -rf build/,即可清空build文件夹。 3. 建立编译目录:在命令行中输入mkdir build && cd build,新建一个名为build的文件夹,同时进入此文件夹。 4. 运行CMake:在build文件夹下,运行cmake .. ,这会自动生成Makefile。 5. 进行Release编译:在build文件夹下,运行make -j4,其中-j4表示使用4个线程进行编译。在编译完成之后,即可生成可执行的、没有调试信息的Release版本的程序。 需要注意的是,如果项目有依赖库,需要在CMakeLists.txt中添加链接库的选项,如target_link_libraries(),以确保在编译时能够正确链接这些依赖库。 总之,CMake Release编译可以生成优化过的、没有调试信息的程序,从而提高应用程序的性能和安全性,是开发人员必须掌握的基本技能之一。 ### 回答3: 在软件开发过程中,我们通常需要将代码编译为可执行文件,以供用户使用。不同的编译方式会影响最终的程序性能、文件大小等因素。 CMake是一款跨平台的编译工具,在编译过程中可以将源代码转化为目标代码或者可执行文件。在使用CMake进行编译时,我们通常会选择编译模式,包括Debug和Release两种。 Debug模式主要用于调试程序,开启了各种优化等设置,但同时也增加了程序的体积,降低了程序的性能。而Release模式则是为了获得最佳的程序性能和最小的程序体积,同时舍弃了调试信息和其他的优化设置。 在使用CMake进行Release编译时,我们需要对CMake进行一些设定。首先,我们需要在CMakeLists.txt中设置编译模式,标明我们要进行的是Release编译。其次,我们需要选择在Release模式下使用哪些编译器选项,以达到最佳的程序性能和最小的程序体积。在编译完成后,我们还可以使用各种工具对程序进行优化设置,以进一步提高程序的性能和减少程序的体积。 总的来说,CMake Release编译过程需要我们进行多次设定和优化设置,以达到最佳的程序性能和最小的程序体积。只有在熟练掌握这些技巧并加以实践之后,才能为我们的程序带来更好的表现和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值