VS 17.5 预览版2:/Gw链接开关的标准一致性改进

news2024/12/24 9:15:15

/Gw 链接开关可以告诉链接器优化代码中的全局数据,从而减小最终生成的二进制文件的大小。在 Visual Studio 17.5 预览版2中,我们新增了一个新的标志:/Zc:checkGwOdr[-] ,目的是在使用 /Gw 开关的时候改进对 C++ 标准的一致性支持。
在之前的版本中,当使用 /Gw 开关的时候,某些单定义规则(ODR)冲突会被忽略,并且不会导致错误。有了这个新标志之后,如果发生这种情况的时候,VS 将会报告错误。如果你正在使用 /Gw,则我们推荐使用 /Zc:checkGwOdr 这个标志。默认情况下,这个标志是被关闭的。在将来的新版本 VS 中,我们可以改变这个默认设置。
如果你想了解关于ODR的解释,/Gw 开关,以及有关这个问题的更多信息,请继续阅读。

让我们来看看下面三个定义,先建立对这个问题的基本背景知识:
1. 首先是 COMDAT,简短的描述是 COMDAT 是可以放置数据的额外段,以使链接器能够潜在地从二进制文件中折叠出所述数据。重要的是,这些部分标有如何处理重复项的策略。有关 COMDAT 历史的更深入探讨,请参阅 Raymond 的博客文章,其中涵盖了它们的使用和历史。
2. 接下来,/Gw 开关是做什么的?该开关使编译器能够将全局数据放入 COMDAT 中。这使我们能够优化未引用的全局变量,或通过它们的 COMDAT 部分合并相同的全局变量。
3. 关于单定义规则(ODR),可以在网上找找相关的信息。

有了上面的背景知识,下面我们来看一个简单的例子:

如果不使用 /Gw 开关,编译上面的代码会产生如下的编译错误:

由于我们在 odr.h 中定义了 MyGlobal,因此我们最终在 foo.obj 和 bar.obj 中都有一个定义,导致链接器报告 ODR 违规。现在,如果我们使用 /Gw 编译:

我们最终没有出现错误,那么发生了什么?它最终回到上面提到的 COMDAT 标志。查看 obj 的头文件,我们可以看到 MyGlobal 确实被放置在 COMDAT 中:

这没有显示的是这个COMODAT已被标记为PICKANY。因此,当找到多个可以合并的候选定义时,链接器会任意选择其中一个并丢弃其余定义。不过这很奇怪,当启用 /Gw 时,此 COMDAT 在创建时被标记为 NOMATCH。NOMATCH,顾名思义,意味着如果找到重复项,链接器应该引发错误,这正是我们想要的。那么,出了什么问题呢?

这里的关键是MyGlobal的定义包括零赋值。这会导致另一个优化启动。由于此全局初始化为零,我们注意到它可以移动到 .bss 部分。由于如果此全局数据位于 .bss 中,则不必存储此全局数据,因此移动 COMDAT 可以减小对象文件大小。不幸的是,当我们移动COMCTAT时,标志从NOMATCH重置为PICKANY,导致我们的错误。

从 17.5 预览版 2 开始,你现在可以使用新标志来确保不会在意外使用 /Gw 时隐藏这些 ODR 违规:

暴露错误后,我们可以在头文件中创建全局 extern,并将定义移动到其中一个 cpp 文件以解决问题:

或者,对于 C++17 及更高版本,可以在定义上使用内联说明符 (inline specifier) 。

通常修复 ODR 违规看起来像这样,尽管并非每种情况都如此简单。如果你使用的是 /Gw,我们鼓励使用 /Zc:checkGwOdr,以防止这些冲突蔓延到你的构建中。由于这是一个标准一致性问题,我们可能会在未来的版本中更改 /Gw 的默认行为以暗示 /Zc:checkGwOdr。

总结

不知道你有什么想法,但我感觉这事儿有点按下葫芦 (/Gw) 浮起瓢 (/Zc:checkGwOdr)。
顺便说一句,Topomel Box 开发中,我压根没用过这些高级优化的劳什子玩意儿。
随它去吧。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Standards conformance improvements to /Gw in Visual Studio version 17.5 Preview 2》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

表情包也能用 AI 生成?如何借助 AIGC 自定义专属表情包 #Memix

随着我们越来越离不开社交媒体,表情包也已经成为我们日常生活中的必备单品。有着个人鲜明风格的「表情包」,不仅是独特的「社交名片」,也能给人留下耳目一新的印象!谁的收藏夹里没有一堆私藏表情包呢!Memix借助 AI 技术…

画中画怎么制作?教你如何录制画中画视频,图文教学

很多小伙伴在录制视频的时候,都需要录制摄像头,以画中画的方式放置在视频当中。在网上眼花缭乱的录屏软件里,有不少的录屏软件是无法做到画中画视频的。画中画怎么制作?今天小编分享2个录制画中画视频的方法,一起来看看…

实心球状CdSe/ZnS/硫量子点QD-AFP-Ab/CPV VLP标记抗体/蛋白的制备方法与电镜表征

实心球状CdSe/ZnS/硫量子点QD-AFP-Ab/CPV VLP标记抗体/蛋白的制备方法与电镜表征 今天小编分享量子点标记蛋白,一起看看吧: 量子点标记蛋白的制备过程: 将纯化后的 CPV-VP2蛋白溶液(测定OD2802.0,蛋白浓度为2mg/ml)和…

CTK Plugin Framework插件框架学习--CTK服务工厂

一、前言 注册服务的时候能够用服务工厂来注册; 访问服务getServeice中的plugin参数是执行ctkPluginContext::getService(const ctkServiceReference&)的插件,从而工厂根据执行的不同插件名称返回不同的服务实现 服务工厂的作用 在服务中可以知道…

华为NAT实验配置

路由器基础配置 AR2 int g0/0/3 ip add 192.168.10.254 24 int g0/0/2 ip add 192.168.20.254 24 int g4/0/0 ip add 192.168.30.254 24 int g0/0/1 ip add 10.0.23.2 24 int g0/0/0 ip add 10.0.12.2 24 ip route-static 192.168.11.0 24 10.0.12.1 ip route-static 192.168.2…

2022年中国数据库排行榜年终盘点-墨天轮

深山虎啸雄风在,绿野兔奔好景来。 崭新的2023年已经到来,在2022年里,国产数据库行业发生了翻天覆地的变化,投融资此起彼伏,国产化替代进程加速,国产数据库行业发展的如火如荼。墨天轮12期中国数据库排行榜解…

Python验证中心极限定理

中心极限定理 中心极限定理提出了:无论总体服从什么分布,只要n充分大,那么样本均值分布就接近正态分布。 样本的数量越大,取样次数越多,样本平均值的分布也就越接近于一条正态分布曲线。普遍的经验是,样本…

redis 5种数据结构适用场景

网上介绍太笼统了,呕心沥血整理出来的可理解的适用场景,查看下图redis-cli指令大全:点击查看redis指令Redis支持5种数据类型:string(字符串)hash(哈希)list(列表&#xf…

飞行类手册国际标准简介

在业界有这个说法:三流的企业卖产品,二流的企业卖技术,一流的企业卖标准。一流企业是行业的标杆,行业的制定者。现在标准已经成为最重要的行业发展因素,谁的产品标准一旦为世界所认同,谁就会引领整个产业的…

指针进阶(C语言)

目录 字符指针 使用方法: 1、指向字符 2、指向字符串的首地址 指针数组 数组指针 数组指针的定义 数组名表示的含义 数组指针的使用 数组参数、指针参数 一位数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 回调函…

网站让百度收录的技巧有哪些?网站在百度收录情况怎么查询

同样都是新上线的站点,为什么有的人是秒收,有的人可能要等很多时间才能收录,其实这些都是有技巧加快百度收录我们网站的。网站让百度收录的技巧有哪些?1、上线之前做好网站内容 我们在上线之前一定要做好充足的准备,这…

浏览器控制台接口学习

我们在做项目开发时,想知道一个功能调用了后台哪个接口,我们就可以在浏览器控制台中进行查看。 举一个例子,我们在看博客时,发现这一篇文章写的不错,我们在做点赞这个动作时,调用了哪个接口呢? …

linux 内存恒等映射

目录 arm64内存管理 恒等映射 页表定义,采用4级分页模型 创建页表 内存属性 从进程角度看,需要内存的地方 1、进程本身,代码段、数据段用来存储程序本身需要的数据 2、栈空间:用来保存函数调用关系、局部变量、函数参数、函…

在centos系统上安装mongodb数据库

在centos系统上安装mongodb数据库 本文章基于centos8系统; 如何查看当前系统是centos的那个版本 终端输入命令 cat /etc/redhat-release 开始安装官网当前的数据库版本6.0; 查看官方文档 创建 mongodb yum 源头,写入基本信息 vim /etc/yum.repos.d/mongodb-org-6.0.repo [mon…

手把手教你如何创建和美化图表,老板直接给我升职!

一图胜千言。说到图表,想必很多人都被网上酷炫的图表震惊过。比如下面这样的可视化图表,看起来,很高大上有没有。但是,拆解开来,就是由一个个基础图表演变而来的。所以可不要小瞧了基础图表的制作。今天我就教你如何用…

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee)

使用ORM方式查询Mongodb里的数据,再也不用记Mongodb的语法(ORM Bee)Mongodb的语法可读性差,要写复杂查询,要求技术能力高;Java驱动,还要使用另一种语法;学习成本太高了。可以使用ORM方式,轻松搞…

【redis6】第三章(五大常用数据类型)

redis命令列表&#xff1a;http://www.redis.cn/commands.html Redis键 set < key >< value >添加键值对 [rootlocalhost ~]# cd /usr/local/bin [rootlocalhost bin]# redis-server /etc/redis.conf [rootlocalhost bin]# redis-cli 127.0.0.1:6379> set k1 a…

电脑怎么恢复出厂设置?Win10系统恢复出厂设置的方法

电脑经常出现报错的情况&#xff0c;而且还有运行缓慢、卡顿的问题&#xff0c;这代表你的电脑可能出现了老化。想要恢复正常&#xff0c;你可以选择把电脑恢复到出厂设置&#xff0c;从而恢复到原始状态。电脑怎么恢复出厂设置&#xff1f;下面以Win10系统电脑为例&#xff0c…

CTK Plugin Framework插件框架学习--插件通信【事件监听】

文章目录一、前言二、事件三、类通信3.1、新建接收插件3.2、新建发送插件3.3、启用插件四、信号槽通信4.1、新建接收插件4.2、新建发送插件4.3、启用插件五、类通信和信号槽通信的区别六、插件依赖七、获取元数据一、前言 CTK框架中的事件监听&#xff0c;其实就是观察者模式&…

Dolphin Streaming实时计算,助力商家端算法第二增长曲线

丨目录&#xff1a;1.背景2.业务问题3.业界解决方案4.技术方案5.应用示例6.业务收益7.总结1. 背景随着业务朝向精细化经营增长&#xff0c;阿里妈妈商家端营销产品更加聚焦客户投放体验&#xff0c;旨在帮助商家提升经营效果&#xff0c;在变化的市场中找到确定增长。近年来&am…