VC Team Blog - TR1实现问答

C++ Tr1中的正则表达式编程 正则表达式是一种强大的模式匹配工具,在C++ Tr1中引入了对正则表达式的支持。通过使用正则表达式,我们可以在文本中查找、匹配和替换特定的模式。本文将详细介绍如何在C++ Tr1中使用正则表达式,并提供相应的源代码示例。通过上述示例,我们了解了如何在C++ Tr1中使用正则表达式进行匹配、查找和替换操作。正则表达式提供了一种强大的文本处理工具,可以在实际开发中应用于各种场景,例如文本解析、数据验证等。除了匹配和查找,我们还可以使用正则表达式来进行替换操作。接下来,我们可以使用正则表达式对象进行匹配操作。 阅读详情
原文: Q&A on our TR1 implementation

大家好,我是Stephan,Visual C++库函数组的程序员。Visual Studio 2008扩展功能库的beta版已经发布(可以在 这里下载,文档在 这里),其中包含了TR1的实现,我想在这里回答一些关于TR1的问题
 
Q. 扩展功能库是针对哪个Visual C++版本的?
A. 扩展功能库是针对Visual C++ 2008的RTM版本(VC9)。目前扩展功能库尚不支持以下版本的VC
  • VC9 Express
  • VC9 RTM以前的版本(比如VC9 beta 2)
  • 老版本的VC(比如VC8)

Q. 是不是把新增的头文件拷到VC/include目录下就可以使用了?
不是。VC9的TR1除了新增了一些头文件之外(比如<regex>),还对原有的头文件进行了修改(比如<memory>),并对原有的CRT库做了更新(比如msvcp90.dll)
因为这次的扩展库并不是仅仅改动了头文件,所以必须使用我们提供的安装程序进行更新。同时你分发自己程序的时候需要使用更新之后的CRT。你可以认为TR1是VC9的“Service Pack 0”

Q: 如果我使用了TR1,会不会引入对MFC库的依赖?或者,如果我使用了MFC的更新,会不会引入对TR1的依赖?
A: 不会。TR1和MFC的更新是独立的。我们将它们放在一起只是为了方便大家更新。

Q: 你们的TR1实现是否完整?
A: 我们的实现涵盖了TR1中的大部分内容。除了TR1文档中Section 5.2和8中提到的部分(参见 http://open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf),我们没有实现。简而言之,我们实现了TR1中对应boost的部分和无序容器。

Q: 既然TR1实现修改了现有的头文件,那会不会对未使用TR1的代码产生负面影响?
A: 理论上是不会的(如果有影响的话,那就是bug了。如果遇到这种bug,欢迎向我们反馈)
TR1的实现应当既不会影响运行期的行为,也不会产生编译期的警告或者错误(我们力图保证VC的库函数至少能和/W4和平共处)
当然,TR1可能会稍微延长你的编译时间(因为代码变多了)。另外如果你预编译头文件的大小很接近/Zm指定的上限的话,新增的代码可能会导致超过上限。这时候,你可以在你的工程中将_HAS_TR1宏的值设为0,这样TR1的代码就不会参与编译了。

Q: TR1实现会影响编译器或者IDE吗?
A: 不会

Q: 你们是否购买了 Dinkumware的TR1实现的授权?
A: 是的,正如我们也购买了他们的STL库的授权。所以,代码的质量是有保证的

Q: 那么,MS做了哪些工作?
A: 简而言之,我们做了非常多的测试,以及一些针对VC的移植工作
  1. 我们将TR1集成进VC9,使得用户能像使用STL一样方便的使用TR1(为此,我们针对我们的编译系统作了大量枯燥乏味的工作,以便将TR1新增的部分集成进msvcp90.dll。对于安装系统而言,我们需要将新的头文件和源代码集成进Visual Studio的安装包)。这样,用户就不用手工修改自己的包含路径,或者发布新的dll。只需要直接使用我们的安装程序打上补丁,更新一下CRT就可以了。
  2. 我们确保TR1能够在/clr和/clr:pure下正常工作 (这本身已经超出了标准C++的范畴,但是是我们必须要支持的特性)。刚开始的时候,这些选项会导致大量的编译期错误和警告。比如说,内部的一个简单的可变参数的函数调用都会产生"本地代码生成"的警告。消除这些编译错误和警告花了相当长的时间
  3. 我们确保TR1能和编译器的/W4在各种情况下和平共处(包括开了/Za或者/Gz,等等)
  4. 我们确保TR1能和编译器的/analyze选项和平共处。如果可能的话,我们会尽量修改代码,以消除警告。如果实在不行的话,我们会暂时屏蔽警告,不过警告屏蔽仅限于标准头文件,不会影响用户的代码。
  5. 我们发现了一些TR1中的bug,并和Dinkumware一起修复这些bug。Dinkumware的代码非常健壮,但是看得人多了,总能多找到一些bug。我就发现了一些TR1文档本身的bug(Issue 726和Issue 727)
  6. 我们尽量让TR1实现的性能能够比肩boost(这是一个很好的比较对象。当然我们也可以和GCC的TR1实现做对比,不过这样的话还要考虑编译器的差异)。在某些方面,VC9的TR1还比不上boost(希望VC10可以),不过我们已经取得了长足的进步。很感谢MS的性能测试组(这个小组是由Rob Huyett负责的),我们发现了一个regex匹配的性能问题,Dinkumware改进之后,性能提高了4~5倍(注意,beta中没有集成这个fix,所以和boost的实现相比,大约要慢18倍。改进后的实现大约慢3.8倍)。function的性能目前已经和boost差不多了(这个fix也没有集成到beta版中)
    “好吧”, 你可能会问, “regex::optimize可以让匹配更快一些吗?”很不幸,目前还不能。VC9的TR1不支持regex::optimize建议的NFA => DFA的转换,不过我们会在VC10中考虑加入这个功能(根据我个人的测试,boost1.34.1里的regex::optimize什么也没有做)。
  7. 我们选择了部分C++0x中的特性,将其引入TR1。比如,TR1中的shared_ptr并没有提供对allcator的支持,但是对我们的用户而言(包括我们自己的编译器),这个特性很重要。所以我们已经将它集成到最终的发布版本,不过在beta版中还没有提供。
  8. 我们为TR1中的类型编写了调试器自动展开脚本,以便在调试过程中查看它们的内容。因为像STL之类的对象往往很复杂,自动展开特性对调试非常有帮助。TR1类型的自动展开脚本基本上都是我编写的(我个人对实现了share_ptr展开时能在"1 strong ref"和"2 strong refs"之间自由切换感到颇为自豪)。不过,需要注意的是,目前的beta版本尚不包括自动展开脚本
  9. 我们和Dinkumware一起修复了一些VC8 SP1和VC9 RTM中的bug。一个和TR1相关的bug是stdext::hash_set/etc中的。原来的版本中,hash_set的swap函数时间复杂度是O(N),会抛出异常,会导致迭代器失效(因为unordered_set/etc重用了hash_set的实现,所以我们在测试的时候发现了这个bug)。修复之后,时间复杂度降低到O(1),不再会抛出异常,也不会使迭代器失效了。
  10. 因为TR1和STL是紧密结合的,所以我们充分利用这一点以提高性能。比如,我们对存放TR1类型的STL容器(比如vector<shared_ptr<T> >和vector<unordered_set<T> >)做了优化,以避免元素的拷贝。
    我们在VC8和VC9中也针对元素类型是STL容器的STL容器做过类似的优化。这个VC8 STL的特性可能很少有人知道。尽管STL的代码大家都能看到,但是通常没有人会去阅读它的实现(当然,通常也没有这个必要)。这个可以看成是利用库实现的C++0x中的move语义,当然和语言级的支持还是有很大的差距。VC8中,我们使用了一些模板的奇技淫巧,使得诸如vector、deque、list的容器能有O(1)时间复杂度的交换,所以容器的容器实际上是通过交换,而不是先拷贝构造,再析构(当然,对内建类型来说,交换的效率反而要低一些)
    现在我们把这个优化应用到了TR1类型上。所有定制了swap()的TR1类型都将获益,包括:shared_ptr/weak_ptr(避免了引用计数的调整)、 function(避免了内存的动态分配)、regex (避免了拷贝整个有限状态机)、 match_results (避免了拷贝vector)、 unordered_set/etc(避免了拷贝)和array (虽然它本身并不支持O(1)的swap,不过我们调用了它的swap_ranges(),所以如果array的元素有O(1)的swap就可以获得性能的提升)
    也就是说,如果vector<shared_ptr<T> >发生了重新分配(比如由于调用了push_back),share_ptr的引用计数不会先加1然后再减1。我觉得这是个很不错的特性。

如果你还有任何关于扩展功能库的问题,欢迎告诉我们!

此致
Stephan T. Lavavej, Visual C++库函数组程序员
primetime如何做voltage scaling 存在这样的情况,标准单元库只有ssgnp0p72vm40c和ssgnp0p9vm40c的libs,但是我们希望它工作在ssgnp0p76vm40c,这样的话就需要用ssgnp0p72vm40c和ssgnp0p9vm40c的libs来scaling出ssgnp0p76vm40c的lib。 阅读详情

相关推荐

Flink on k8s 环境搭建(一)

Flink on Yarn的环境搭建过程中,需要进行配置较多,且需要搭建zookeeper Hadoop Yarn 等相关组件,安装流程比较复杂,集群出现问题重新安装的流程也比较复杂,且Yarn的3个节点中 只能起了 3个resourceManager和1个NodeManager,Flink 作业申请资源时只能 向NodeManager的节点申请资源,整体有资源瓶颈的隐患(后继flink作业会越来越多),现在尝试进行Flink on k8s 的环境搭建。

wangqiaowq的博客 3412

error C2039: ‘tr1‘: is not a member of ‘std‘

最近在VS2019的工程中集成gtest,发现报错如下: error C2039: 'tr1': is not a member of 'std' error C3083: 'tr1': the symbol to the left of a '::' must be a type 原因:可能是C++11新特性导致 解决方案: 在CmakeLists文件中预定义_HAS_TR1_NAMESPACE 宏,通知编译器支持C++11 add_compile_definitions(_..

lihaidong的博客 1901

SAP SD科目确定:从配置到凭证的财务集成核心

本文深入解析SAP SD科目确定的核心价值与配置实践,涵盖从主数据准备到财务凭证生成的全流程。通过六步配置法和KOFI00过程拆解,帮助企业实现销售与财务模块的高效集成,确保收入、成本等数据准确归集至对应会计科目,提升财务自动化水平与数据准确性。

weixin_33491377的博客 251

TR1库介绍

C++ Technical Report 1 (TR1)  是ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称。TR1是一份文件,内容提出了对C++标准函式库的追加项目。这些追加项目包括了正则表达式、智能指针、哈希表、随机数生成器等。TR1自己并非标准,他是一份草稿文件。然而他所提出的项目很有可能成为下次的官方标准。这份文件的目标在于「为扩充

王教余的专栏 4031

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 319

数据驱动的老年人健康管理与生活品质提升实践研究

摘要 全球人口老龄化趋势显著,2025年65岁以上人口预计达8.57亿,中国老年人口已突破3亿。老年人健康挑战突出,75%以上患慢性病,且独居老人心理健康与应急需求迫切。数据驱动的健康管理通过智能设备(如跌倒检测、远程监测)和AI技术(如疾病预测算法)提升效率,改善生活品质。研究提出差异化需求解决方案,如慢性病患者的持续监测与用药管理,高龄老人的综合护理服务,并探讨政策与商业模式以推动智慧养老产业发展,2024年市场规模已达6.8万亿元。

聚焦程序设计语言理论与前沿技术落地,拆解代码世界的底层逻辑,探索语言设计的 “创造与沟通” 之道。从编译原理、类型系统到 AI 技术在金融、医疗、制造、养老、大健康等领域的实战案例,分享硬核技术干货与工程化思考。 1629

打开VS2008 SP1对C++ TR1头文件的语法高亮支持

原文:http://blogs.msdn.com/xiangfan/archive/2008/12/13/enable-syntax-highlighting-for-tr1-headers-in-vs2008-sp1.aspx很不幸,VS2008 SP1不能自动识别新增的C++ tr1的头文件。这意味着你将无法得到语法高亮和智能感知。这是VS的一个bug,不过你可以自己动手修复它。秘密在

Van's House 3520

Windows安装ros2(Jazzy版本+win10/win11)-4.构建ros2结点

这个位置也是ros2搜索package以及搜索node的路径, 如果把构建好的可执行文件乱动位置的话就找不到节点了,当然如果复制一个可执行文件以及可执行文件-script.py文件, ros2也就会认为你有一个新的节点了,运行这个拷贝的可执行文件程序都是ok的。由于上一个文章给powershell7也增加了启动执行ros2的环境初始化文件local_setup.ps1, 所以我们也可以直接在vscode中运行节点, 此种方式没有经由ros2托管, 缺少其他ros2的附加能力。

weixin_48398592的博客 7113

linux下如何使用C++ tr1

linux下如何使用C++ tr1 #include &lt;iostream&gt;  #include &lt;stdio.h&gt; #include &lt;tr1/memory&gt;  // tr1不能少, tr1目录是在/usr/include/c++/gcc-version/tr1目录 #include &lt;tr1/functional&gt;   using nam...

谢小军的专栏 5172

【Bug已解决】codex: tool call timeout / Function execution exceeds limit — CodeX CLI 工具调用超时解决方案

CodeX CLI 工具调用超时(Bash/文件/MCP)的解决方案,含增加超时、拆分命令、后台运行、避免交互卡住与限制读取。

博客 4204

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 817

C++Primer第五版:练习2.18 2.19 2.20 2.21 2.22 2.23 2.24

练习2.18 #include<iostream> int main() { int i = 5; int j = 6; int* pi = &i; pi = &j;//更改指针的值 *pi = 7;//更改指针所指对象的值 } 练习2.19 指针本身是一个对象,允许对指针赋值和拷贝,而且在指针的声明周期内它可以先后指向几个不同对象。 指针无须在定义时赋初值。在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。 引用并非对象,它为对象起了一个别名。定

Xgggcalled的博客 656

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系

孤独的单刀 4348

多线程

,,

adTeam_的博客 234

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++之TR1::function

对于TR1文档中的function的总结。

u013696062的专栏 3176

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++ std::tr1::shared_ptr使用

看《effective c++》,作者一直强调用std::tr1::shared_ptr,比起auto_ptr好多了。 shared_ptr采用引用计数,多个指针可以指向同一个对象;auto_ptr就不能,只能运行一个指针指向一个对象:如果要指针赋值,那么原来的指针要放弃对该对

randyjiawenjie的专栏 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 217

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 332

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 385

[C++]:6.STL:vector

今天就要开始学vector容器,这节课我们主要学习vector中经常会用到的函数,并且给出该函数的模拟实现。话不多说,直接上干货。下面是本章的思维导图,那么,让我们开始吧!

2301_80817679的博客 136

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析

蓝桥杯报名正在火热进行(软件赛报名 2026-10-08—12-18,省赛 2027-04-10),电子学会 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名也已开启(9/23—12/2),全国青少年信息素养大赛算法应用主题赛同步推进——把 LCA 这个模板练熟,正是冲刺这些赛事树型考点的关键一步。所谓「最近公共祖先」:在一棵以某个节点为根的树里,两个节点 u、v 向上追溯,最早交汇的那个祖先就叫它们的 LCA。比如家谱里,你和你表哥最近的共同长辈就是你们的祖父。

IT_Scratch的博客 532

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 339
上一篇: 汉之云的“免CD”,盗版商的胜利?
下一篇: 游戏资源提取软件介绍
vbvan
博客等级 码龄19年 132粉丝 40原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值