小编pav*_*von的帖子

是标准定义的std :: array的大小

在C++ 11 std::array中定义的连续存储和性能并不比数组差,但我不能确定标准的各种要求是否意味着std :: array具有与普通数据相同的大小和内存布局阵列.那是你可以指望的sizeof(std::array<int,N>) == sizeof(int)*N还是具体的实施?

特别是,这保证按照您期望的方式工作:

std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array
Run Code Online (Sandbox Code Playgroud)

它适用于我尝试过的两个编译器(GNU和Intel).此外,我能找到的所有第三方文档(如下所示)都表明std :: array与普通数组一样具有内存效率,它与连续需求相结合意味着它必须具有相同的内存布局.但是我在标准中找不到这个要求.

c++ stl language-lawyer c++11

36
推荐指数
1
解决办法
3290
查看次数

检查JUnit测试中的深度相等性

我正在为克隆,序列化和/或写入XML文件的对象编写单元测试.在所有三种情况下,我想验证结果对象是否与原始对象"相同".我在我的方法中经历了几次迭代,并且发现了所有这些问题的错误,想知道其他人做了什么.

我的第一个想法是在所有类中手动实现equals方法,并使用assertEquals.在决定覆盖equals以对可变对象执行深度比较之后,我放弃了这种方法是一件坏事,因为你几乎总是希望集合对它们包含的可变对象使用引用相等[1].

然后我想我可以将方法重命名为contentEquals或其他东西.然而,经过更多的思考,我意识到这无助于我找到我正在寻找的那种回归.如果程序员添加了一个新的(可变的)字段,并忘记将它添加到克隆方法中,那么他可能会忘记将它添加到contentEquals方法中,而我写的所有这些回归测试都将毫无价值.

然后我写了一个漂亮的assertContentEquals函数,它使用反射来检查对象的所有(非瞬态)成员的值,必要时递归.这避免了上面的手动比较方法的问题,因为它默认假定必须保留所有字段并且程序员必须显式声明要跳过的字段.但是,有一些合法的情况,克隆后字段确实不应该相同[2].我输入了一个额外的参数toassertContentEquals,它列出了要忽略的字段,但由于这个列表是在单元测试中声明的,所以在递归检查的情况下它真的很难实现.

所以我现在想回到在每个被测试的类中包含一个contentEquals方法,但这次使用类似于上面描述的assertContentsEquals的辅助函数实现.这种方式在递归操作时,将在每个单独的类中定义豁免.

任何意见?你过去如何处理这个问题?

编辑阐述我的想法:

[1]我从这篇文章中得到了理解,因为它没有覆盖可变类的等于.一旦你将一个可变对象粘贴在一个Set/Map中,如果一个字段发生变化,那么它的散列会改变但是它的存储桶不会改变它.因此,选项是不对可变对象重写equals/getHash,或者具有一个策略,一旦将可变对象放入集合中,就永远不会更改它.

我没有提到我正在现有的代码库上实现这些回归测试.在这种情况下,改变equals的定义,然后必须找到它可以改变软件行为的所有实例的想法吓坏了我.我觉得我可以轻松打破比我修复更多的东西.

[2]我们的代码库中的一个示例是图结构,其中每个节点都需要一个唯一的标识符,用于在最终写入XML时链接节点XML.当我们克隆这些对象时,我们希望标识符不同,但其他所有内容保持不变.在对它进行反复思考后,似乎问题"这个对象已经存在于此集合中"和"这些对象是否定义相同",在这种情况下使用基本不同的相等概念.第一个是询问身份,如果进行深度比较,我希望包括ID,而第二个是询问相似性,我不希望包含ID.这使我更倾向于实施equals方法.

你们同意这个决定,还是认为实施平等是更好的方法?

java junit equality

13
推荐指数
1
解决办法
3294
查看次数

从 git log --graph 中排除遥控器

我想展示我所有 git 分支之间关系的简单图表。到目前为止,我得到的最接近的是这个命令:

git log --graph --oneline --branches --decorate --simplify-by-decoration

但是,我从事的项目有大量其他开发人员使用的远程分支,我不关心这些分支,并且将它们包含在图表中使我很难看到我的分支之间的联系。我试过添加--not --remotes="*",但这消除了太多提交,以至于我完全松散了树结构,只得到了一个像branch -v.

有什么建议?

编辑:我想使用标准命令行工具找到可能的最佳解决方案,因为我通常不在自己的计算机上工作,并且不能依赖正在安装的其他第三方软件。

git

6
推荐指数
1
解决办法
283
查看次数

我是否需要处理从Component.getGraphics()返回的图形上下文?

我已经知道你需要在完成使用它们时创建的Graphics对象上调用dispose().但是,在创建Graphics对象时,我很难从API文档中找出答案.

显然,当一个Graphics对象被传递到回调的话,我没有创建它,而不应处置它(或从我所听到的修改以任何其他方式),如果我叫Graphics.create( ),然后我正在创造它,我应该处理它.

但是当我调用Component.getGraphics()时呢?这是否会创建一个我负责处理的新Graphics2D对象,或者它是否返回对我不应该修改的现有对象的引用?文档没有说明.

java awt

5
推荐指数
1
解决办法
642
查看次数

你能用 tcsh 作为 shell 来重定向 GDB 中的 stderr 吗?

我正在调试一些代码,当我单步执行一个线程时,我收到大量从另一个线程打印到 STDERR 的超时错误消息。我想隐藏打印到 stderr 的所有内容。我尝试在启动应用程序时使用重定向:

(gdb) run 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

但这似乎也在重定向标准输出,我需要在单步执行代码时在我的对象上调用漂亮的打印函数。

PS 我正在使用 GDB 7.2,不,我无法升级:(

PPS 我不认为这会依赖于 shell,但我正在运行 tcsh 6.17

gdb

4
推荐指数
1
解决办法
3676
查看次数

标签 统计

java ×2

awt ×1

c++ ×1

c++11 ×1

equality ×1

gdb ×1

git ×1

junit ×1

language-lawyer ×1

stl ×1