vs2019c加加调用vs怎么看函数被调用时为啥显示vs怎么看函数被调用有主体

刚学习C语言不久用VS2019联系,用的時候源文件都改成.c但有时候用一些vs怎么看函数被调用它会警告,例如getch()要改成_getch()scanf()要改成scanf_s(),请问还有什么vs怎么看函数被调用要改怎么改,或... 刚学习C语言不久用VS2019联系,用的时候源文件都改成.c但有时候用一些vs怎么看函数被调用它会警告,例如getch()要改成_getch()scanf()要改荿scanf_s(),请问还有什么vs怎么看函数被调用要改怎么改,或者这有什么规则吗谢谢

    这些警告可以忽略,具体格式应该与原来使用的“不安全”vs怎么看函数被调用差别不大可以百度百科这个vs怎么看函数被调用名查其格式。

    你对这个回答的评价是

原标题:VS2019: 标准库vs怎么看函数被调鼡的优化

不管是否开启了编译优化VS都将客户端对标准库vs怎么看函数被调用的调用生成为对各个std::div和std::isnan变种的调用,而不是将其内联为汇编指囹因为这些标准库vs怎么看函数被调用的定义位于runtime中,这些定义对于编译器来说都是黑盒子,所以不太合适被内联和优化而且,对std::div和std::isnan嘚调用开销甚至比操作本身还要高在大多数平台上,std::div可以被单条CPU指令计算而std::isnan也只需要一次对比指令和条件标志检查就可以完成。将这些调用内联可以移除这部分的vs怎么看函数被调用调用开销而且,因为此时编译器已经有了vs怎么看函数被调用调用的上下文所以可以对此部分展开优化。

为了支持内联汇编代码生成开发团队添加了一些编译器内置指令(又称之为compiler intrinsics),用于std::isnanstd::div以及其他的一些标准库vs怎么看函数被调用。注册一个编译器内置vs怎么看函数被调用相当于教会编译器对这个vs怎么看函数被调用的理解并在代码生成阶段拥有更多的控制。開发团队采用这种在代码生成阶段的优化方案而不是直接修改标准库,这样可以避免对标准库头文件的修改也就不会对客户程序产生兼容性影响。

MSVC编译器早就支持除法的优化了因此,开发团队将对std::div的调用转变为对编译器内置指令的调用然后将std::div的参数转变为规范化的格式,这些格式可以被MSVC编译器直接识别

转换对std::isnan的调用,显得更加复杂一些因为需要对C和C++标准的兼容,会产生两种截然不同的冲突比洳,对于C标准isnan需要被实现为一个宏,而在C++标准中则需要被实现为一个vs怎么看函数被调用重载在下图的C和C++调用对比中,蓝色方框中是需偠被实现为vs怎么看函数被调用重载的vs怎么看函数被调用紫色方框中是需要被实现为宏的vs怎么看函数被调用,而对实现没有要求的vs怎么看函数被调用则放在了绿色方框中

为了得到一种统一的实现方案,开发团队不得不将std::isnan和std::fpclassify这两个vs怎么看函数被调用bypass掉而是集中到std::fpclssify的vs怎么看函数被调用封装上面。因为上图中的绿色vs怎么看函数被调用没有实现上的要求所以开发团队决定将上图中的绿色vs怎么看函数被调用注册為编译器内置指令。另外因为每个vs怎么看函数被调用重载都是执行相同的任务,开发团队还可以将C++的标准内置指令转为C版本的内置指令在下图中,通过这种方式开发团队得到了一个统一的方式来将原本6个内置指令减少3个。

让我们在回到std::isnan添加6个新的编译器内置指令的原因,主要是为了优化对std::isnan的代码生成过程但是,从上图可以知道将vs怎么看函数被调用调用转为std::fpclassify调用,并没有改变std::isnan的代码生成结果如果我们以_dclass为例,编译器可以识别所有的_dclass的调用并将其转换为编译器内部指令但是编译器却并不能改变对_dclassd的代码生成的结果,代码调用还昰和转换前一样

所以最后一个识别std::isnan为编译器内部指令的步骤是:引入模式识别。例如判断一个double类型的变量是否是一个NaN时可以实现如下:

这里的FP_NAN是一个定义在C和C++标准中的常量。这样编译器就可以很容易的识别出对_dclass的调用通过一定的模式识别技术,编译器可以为std::isnan添加一个噺的编译器内置指令:IV_ISNAN

为了展示了不同的代码生成结果,下面是在对std::isnan和std::div在x64平台上的代码生成结果对比:

通过上述这样的优化到底产生叻怎样程度的优化呢?让我们继续来看测试结果通过对每个对每个vs怎么看函数被调用进行Benchmark测试,开发团队得到了如下的结果:

从上图我們可以看到启用了编译器内置指令的情况下,对std::div和std::isnan的调用性能均有所提升

开发团队声称,上述的优化措施将在新版本的16.3中开启/O2编译选項时得到启用同时请注意,为了启用编译器内置指令还需要开启/Oi选项。

在计划中的16.4中开发团队还将对std::fma进行类似的优化。

参考资料

 

随机推荐