考虑以下使用new的简单代码(我知道没有delete[],但它不属于这个问题):intmain(){int*mem=newint[100];return0;}是否允许编译器优化new调用?在我的研究中,g++(5.2.0)和VisualStudio2015不优化new调用,whileclang(3.0+)does.所有测试都是在启用完全优化的情况下进行的(-O3用于g++和clang,用于VisualStudio的Release模式)。new不是在幕后进行系统调用,使得编译器不可能(并且非法)对其进行优化吗?编辑:我现在已经从程序中排除了未定义的行为:#includeintmain()
考虑以下使用new的简单代码(我知道没有delete[],但它不属于这个问题):intmain(){int*mem=newint[100];return0;}是否允许编译器优化new调用?在我的研究中,g++(5.2.0)和VisualStudio2015不优化new调用,whileclang(3.0+)does.所有测试都是在启用完全优化的情况下进行的(-O3用于g++和clang,用于VisualStudio的Release模式)。new不是在幕后进行系统调用,使得编译器不可能(并且非法)对其进行优化吗?编辑:我现在已经从程序中排除了未定义的行为:#includeintmain()
如果我这样做typedefvoidCb();intfoo(intconst&a,Cbcb){intx=a;cb();returnx-a;}并用g++-O3-save-temps-cfoo.cpp编译,我看到减法被保留,而ifcb();被注释掉,整个函数优化为xorl%eax,%eax我可以对参数a的规范做些什么,这样无论对cb()的调用如何,减法都会得到优化,并且不会强制执行a是唯一的引用(即,它可以在其他地方引用,但不会通过这些引用对其进行修改)? 最佳答案 有__restrict扩展,你可以试试gcc.godbolt.org:t
如果我这样做typedefvoidCb();intfoo(intconst&a,Cbcb){intx=a;cb();returnx-a;}并用g++-O3-save-temps-cfoo.cpp编译,我看到减法被保留,而ifcb();被注释掉,整个函数优化为xorl%eax,%eax我可以对参数a的规范做些什么,这样无论对cb()的调用如何,减法都会得到优化,并且不会强制执行a是唯一的引用(即,它可以在其他地方引用,但不会通过这些引用对其进行修改)? 最佳答案 有__restrict扩展,你可以试试gcc.godbolt.org:t