问题标签 [gotw]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Why not resize and clear works in GotW 54?
Referring to article Gotw 54 by HerbSutter, he explains about
The Right Way To "Shrink-To-Fit" a vector or deque and
The Right Way to Completely Clear a vector or deque
Can we just use
container.resize()
andcontainer.clear()
for the above task or am I missing something?
c++ - Gotw 67 中的一个示例
http://www.gotw.ca/gotw/067.htm中有一个例子
当您将双精度更改为浮点时,它在 VS2008 中是一个无限循环。根据Gotw的解释:
如果 float 不能准确表示从 0 到 1e8 的所有整数值怎么办?然后修改后的程序将开始倒计时,但最终会达到一个无法表示且 N-1 == N 的值 N(由于浮点精度不足)......然后循环将卡住直到运行程序的机器没电为止。
据我了解,IEEE754 浮点数是单精度(32 位),浮点数的范围应该是 +/- 3.4e +/- 38,它应该有 7 位有效。
但我仍然不明白这是怎么发生的:“最终达到一个无法表示的值 N 并且 N-1 == N (由于浮点精度不足)。” 有人可以尝试解释这一点吗?
一些额外的信息:当我使用 double x = 1e8 时,它在大约 1 秒内完成,当我将其更改为 float x = 1e8 时,它运行的时间要长得多(5 分钟后仍然运行),如果我将其更改为float x = 1e7;
,它在大约 1 秒内完成。
我的测试环境是VS2008。
顺便说一句,我不是在问基本的 IEEE 754 格式解释,因为我已经理解了。
谢谢
c++ - gotw 80 语法 - 参数列表中的初始化
Gotw 80包括以下示例:
本文将讨论为什么该行s = f()
不正确 - 由于对象生命周期和构造顺序。文章指出,当时编译器没有发现错误。
但是,忽略初始化顺序和对象生存期的问题,我看不出s = f()
构造函数的参数列表在语法上如何合法 - 它似乎试图初始化参数列表中的成员(或者可能声明默认值价值)。谁能解释这个语法试图做什么?
c++ - GotW #101“解决方案”真的解决了什么问题吗?
首先阅读 Herb 的 Sutters GotW 关于 C++11 中 pimpl 的帖子:
我在理解 GotW #101 中提出的解决方案时遇到了一些麻烦。据我所知,GotW #100 中辛苦解决的所有问题都卷土重来:
成员是离线模板,并且定义在
pimpl
使用点不可见(在class widget
的类定义和隐式生成的特殊成员函数中widget
)。也没有任何明确的实例化。这将在链接期间导致未解决的外部错误。widget::impl
在定义实例化的地方仍然不完整pimpl<widget::impl>::~pimpl()
(我认为它实际上根本没有实例化,只是被引用)。因此调用指向不完整类型的指针,如果具有非平凡的析构函数,则会产生未定义的行为。std::unique_ptr<widget::impl>::~unique_ptr()
delete
widget::impl
请解释是什么迫使编译器在完整的上下文中生成特殊成员widget::impl
。因为我看不出这是如何工作的。
widget::~widget()
如果 GotW #101 仍然需要在实现文件中明确定义widget::impl
,那么请解释“更强大”的评论(@sehe 在他的回答中引用)。
我正在查看 GotW #101 的核心主张,即包装“消除了一些样板文件”,在我看来(基于本段的其余部分)意味着widget::~widget()
声明和定义。所以请不要在你的答案中依赖它,在 GotW #101 中,那已经消失了!
Herb,如果您路过,请让我知道是否可以在此处剪切+粘贴解决方案代码以供参考。
c++ - C++ 最令人头疼的解析又来了
直接取自http://herbsutter.com/2013/05/09/gotw-1-solution/
虽然widget w();
对我来说很清楚,但我不知道下面的代码如何成为函数声明?
这怎么可能?
c++ - 第67周大师的理解:双倍或一无所有
最近,我正在阅读Herb Sutter 的 GOTW 的 Double or Nothing的帖子, 我对以下程序的解释感到有些困惑:
假设这段代码在某台机器上运行 1 秒。我同意这样的代码很愚蠢的观点。
但是,根据有关问题的解释,如果我们x
从更改float
为double
,那么在某些编译器上,它将使计算机永远运行。解释基于标准中的以下引用。
引用 C++ 标准的第 3.9.1/8 节:
有三种浮点类型:float、double 和 long double。double 类型提供的精度至少与 float 一样,long double 类型提供的精度至少与 double 一样。float 类型的值集是 double 类型的值集的子集;double 类型的值集是 long double 类型的值集的子集。
代码的问题是:
如果将“double”更改为“float”,您预计需要多长时间?为什么?
以下是给出的解释:
它可能需要大约 1 秒(在特定的实现中,浮点数可能比双精度更快、一样快或稍慢),或者永远需要,这取决于浮点数是否可以准确地表示从 0 到 1e8 的所有整数值(包括在内)。
标准中的上述引用意味着可能存在可以用双精度表示但不能用浮点表示的值。特别是在一些流行的平台和编译器上,double 可以准确地表示 [0,1e8] 中的所有整数值,但 float 不能。
如果 float 不能准确表示从 0 到 1e8 的所有整数值怎么办?然后修改后的程序将开始倒计时,但最终会达到一个无法表示且 N-1 == N 的值 N(由于浮点精度不足)......和
我的问题是:
如果 float 都不能表示1e8
,那么我们初始化的时候应该已经溢出了float x = 1e8
;那我们怎么能让电脑永远运行呢?
我在这里尝试了一个简单的例子(虽然不是double
但是int
)
这意味着如果编译器无法用int
类型表示给定的数字,则会导致溢出。
那我是不是看错了?我错过了什么?正在x
从更改double
为float
未定义的行为吗?
谢谢!
c++ - 如何修复这个典型的异常不安全代码?
根据GOTW #56,以下代码中存在潜在的经典内存泄漏和异常安全问题:
原因是当 wenew T1
或时new T2
,类的构造函数可能会抛出异常。
同时,根据解释:
简要回顾:简单地说,像“new T1”这样的表达式称为 new-expression。回想一下 new-expression 的真正作用(为简单起见,我将忽略放置和数组形式,因为它们在这里不是很相关):
它分配内存
它在该内存中构造一个新对象
如果构造因异常而失败,则释放分配的内存
因此,每个 new 表达式本质上是一系列两个函数调用:一个对 operator new() 的调用(要么是全局的,要么是由正在创建的对象的类型提供的),然后是对构造函数的调用。
对于示例 1,考虑如果编译器决定生成如下代码会发生什么:
1:为 T1 分配内存
2:构造 T1
3:为 T2 分配内存
4:构造 T2
5:调用 f()问题是这样的:如果第 3 步或第 4 步由于异常而失败,则 C++ 标准不要求销毁 T1 对象并释放其内存。这是典型的内存泄漏,显然不是一件好事。[...]
通过阅读更多:
为什么标准不通过要求编译器在清理时做正确的事情来防止问题?
基本的答案是它没有被注意到,即使现在它已经被注意到,也可能不需要修复它。C++ 标准允许编译器对表达式的求值顺序有一定的自由度,因为这允许编译器执行原本不可能的优化。为实现这一点,表达式评估规则以非异常安全的方式指定,因此如果您想编写异常安全代码,您需要了解并避免这些情况。(请参阅下文了解如何最好地做到这一点。)
所以我的问题是:
如何修复这个典型的异常不安全代码?我们应该避免编写这样的代码吗?
答案让我有点困惑,为了处理构造函数失败,我们应该根据C++ FAQ从构造函数中抛出异常并确保分配的内存被正确释放,所以假设类 T 确实实现了处理构造失败的代码,我们是否上面的代码中还有异常安全问题吗?
感谢您的时间和帮助。
c++ - 为什么用 make_unique 调用初始化 unique_ptr?
取自:http ://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/
我们为什么要写:
而不仅仅是:
我唯一的猜测是,如果我们想要auto
,我们需要帮助它推断出正确的类型(base
这里)。
如果是这样,那么对我来说,这将是一个值得怀疑的优点..在..auto
的右侧键入然后键入大量初始化=
我错过了什么?
c++ - 最终类的用例
我正在阅读Herb Sutter 的 Guru of the Week redux 关于函数的评论virtual
,最后看到他提到了这一点:
[...] “final 的使用比较少”——嗯,确实是这样。我不知道有多少,在标准化过程中,Bjarne 反复询问它解决的问题的示例以及应该在哪些地方使用它的模式,我不记得有任何突出的主要问题。我唯一知道的是,如果您要定义一个库模块(这还不是标准概念),那么将叶类设为 final 可以为编译器提供更多信息来去虚拟化调用,因为知道库之外的代码不会' t 进一步推导,但我不确定这些天在包括积极去虚拟化在内的整个程序优化存在的情况下有多重要。
该答案没有提供很多final
关于类用例的示例,我很想知道它可以真正解决哪些问题。您知道吗,或者final
课程只会成为一些晦涩且几乎未使用的功能?
c++ - 作者在 GotW #53 中想说什么?
这个伪代码是从GotW #53获得的,标题是“A Not-So-Good Long-Term Solution”。几个小时以来,我一直在试图理解作者在说什么,特别是与下面以“//错误:潜在......”开头的评论有关,但无济于事。我真的很感激这方面的一些帮助。