编译选项/O

我们通过编译选项/O来指导编译器按怎样的优化形式编译程序,主要是两个方向,一是高的执行效率,二是小的二进制文件。

Visual Studio编译器默认的优化编译选项Release版本是/O2,Debug版本是/Od。同时还都可以在对应的复选框中选择其他选项,那么这些选项的含义是什么,有什么区别?

  • /Ob:/Od下的默认值,禁止内联扩展。仅允许在类声明中定义为C++成员函数中对标记为__inline或__forceinline的函数进行扩展。注意:内联选项仅是对编译器的一个建议,不能保证编译器对指定的函数扩展。相反地,我们可以明确地禁用内联扩展。但是却不能明确地启用内联扩展。即使使用了关键词__inline或__forceinline,但指定的函数也不一定扩展。
    /Ob0:**默认值,禁用内联扩展。
    /Ob1:仅允许在类声明中定义的 c + + 成员函数中对标记为内联、 __inline或__forceinline或的函数进行扩展。
    /Ob2:/O1和/O2下的默认值。 允许编译器展开未显式标记为 “无内联” 的任何函数。
    相关指令:
    __declspec (noinline)
    #pragma auto_inline (off) #pragma auto_inline (on)

  • /Og:已弃用。可以提供如下几个优化:
    1.本地或全局公共子表达式消除。
    2.自动注册分配。允许频繁被使用的变量或子表达式存储在寄存器中。
    3.循环优化。删除循环体中固定的子表达式。避免重复计算。

  • /Oi:指示编译器使用内部函数。内部函数相对应的是普通函数,内部函数是编译器以及架构相关的,没有可移植性。内部函数与编译器合作,可以提供比内联函数更高效的实现。内部函数仅是某些特定的函数,没有自定义的。
    相关指令:
    #pragma intrinsic( 内部函数名称列表 ) 用于指定单个内部函数或用逗号分隔的多个内部函数
    #pragma function( 内部函数名称列表 ) 在 /Oi下,使用强制使用函数调用而不是内部函数

  • /Os /Ot:/Os(优选小代码) 通过指示编译器优选大小以提高 Exe 和 Dll 的大小来最大程度地减小其大小;/Ot优选速度快的代码) 通过指示编译器优选速度来最大程度地提高 Exe 和 Dll 的速度。两个选项相对应,不能同时出现。二者的差别是对于特定的操作使用不同的处理方式,比如乘法/Os会直接使用*指令,一条执行执行完毕,代码量最小;/Ot会将乘法转换为位移操作,换成多条指令,速度提升但是代码量增加。

  • /Ox:速度优化选项。是一系列速度优化选项的集合,但却是/O2的子集。/Ox与/O2相比,没有保函/Gf(重复字符串公用),/Gy(函数级链接)选项。

  • /Oy:禁止在调用栈上创建帧指针,以使得函数调用更快。此选项仅限于32位系统。

  • /O1:/Og /Os /Oy /Ob2 /GF /Gy

  • /O2:/Og /Oi /Ot /Oy /Ob2 /GF /Gy

  • /Ob:关闭该程序中的所有优化并加快编译

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值