小编Ste*_*314的帖子

什么是CPU寄存器以及它们是如何使用的,尤其是WRT多线程?

这个问题和我下面的答案主要是为了回应另一个问题中的一个混乱领域.

在答案的最后,有一些问题WRT"易变"和线程同步,我不是完全有信心 - 我欢迎评论和替代答案.然而,问题的关键主要涉及CPU寄存器及其使用方式.

compiler-construction assembly code-generation cpu-registers

4
推荐指数
2
解决办法
2万
查看次数

GHC扩展的语义允许对方法进行约束(-XConstrainedClassMethods)

以下内容来自GHC用户指南(Haskell Platform 2012.4.0.0)...

7.6.1.3.类方法类型

Haskell 98禁止类方法类型提及类类型变量的约束,因此:

class Seq s a where
  fromList :: [a] -> s a
  elem     :: Eq a => a -> s a -> Bool
Run Code Online (Sandbox Code Playgroud)

elem的类型在Haskell 98中是非法的,因为它包含约束Eq a,仅约束类类型变量(在本例中为a).GHC解除了这一限制(flag -XConstrainedClassMethods).

但是,我没有看到任何解释这意味着什么.我可以看到两种可能性......

  1. Seq类型的类隐式斩获Eq a来自约束elem.
  2. elem方法不能用于类型类Seq在的情况下a是不类的成员Eq(或其中它是一个部件,但是其中这是未知的elem时).

我强烈怀疑(2)因为它似乎有用,而(1)似乎没用.(2)基本上允许为可以支持它们的情况定义方法,而不限制类型类仅为这些情况实例化.

这个例子似乎正是在激发这一点 - 这个想法elem通常对于序列来说是一个有用的操作,对于没有它们来说太有价值,但我们也想要支持那些elem不受支持的序列,例如函数序列.

我是对的,还是我错过了什么?这个扩展的语义是什么?

polymorphism haskell typeclass ghc

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

如何保持时间没有累积错误?

如何在一个简单的嵌入式系统中跟踪时间,假设您需要以秒为单位的时间的定点表示,并且您之间的时间间隔不能以该定点格式精确表达?在这些情况下,如何避免累积错误.

这个问题是对slashdot 这篇文章的反应.

0.1秒不能整齐地表示为二进制定点数,正如1/3不能整齐地表示为十进制定点数.任何二进制定点表示都有一个小错误.例如,如果在该点之后有8个二进制位(即使用按256缩放的整数值),则0.1乘256为25.6,将四舍五入为25或26,导致-2.3%的错误或分别为+ 1.6%.在该点之后添加更多二进制位会减小此错误的比例,但无法消除它.

重复添加后,误差逐渐累积.

如何避免这种情况?

embedded idioms

3
推荐指数
1
解决办法
566
查看次数

需要存储哪些状态才能允许可恢复的哈希计算?

这个问题只与现实世界的问题间接相关,更令人感兴趣.我不知道当前的真实哈希算法如何在内部工作.

我知道典型的哈希计算(和CRC计算等)逐步工作,依次更新每个字节/字的某些状态[事实证明,算法一次只能处理一个块,尽管接口通常会自动处理].因此,稍后可以恢复部分完成的哈希计算 - 存储该状态,然后重新加载并继续您离开的位置.关于SO的问题已经存在,但它们似乎都与特定的图书馆有关.

从CRC-16的古老知识(是的,真的 - 由于过时的文件格式),我的印象是CRC值本身就是你需要存储以恢复计算的所有状态.显然,实现可以用奇怪的方式编写,但原则上到目前为止看到的文件部分内容的CRC-16是从该点恢复计算所需的完整状态.

现在使用的所有常见哈希计算都是如此吗?特别是MD5,SHA-1和SHA-256.或者是否必须存储其他(附加或替代)状态才能恢复计算?

显然需要从文件中恢复的位置,但除此之外,您需要存储什么样的精确状态才能使用公共散列函数恢复散列计算.

对于额外的奖励积分 - 如何在C++中使用Crypto ++访问该状态?(链接或对文档正确部分的引用可能非常有用).

我将其标记为"算法",因为这是此处的重点 - 来自现实世界算法的要求,而不是任何特定语言或库的实现.

algorithm hash cryptography

3
推荐指数
1
解决办法
421
查看次数

在多年的C++之后,我在哪里可以找到学习C的快速参考?

我上次在1997年IIRC左右专业使用C. 从那以后我使用了很多C++.现在,我发现我需要再次使用一些C.

我确信的一件事是,我不能只删除明显的C++特性(例如类)并期望一切都能正常工作.有各种不太明显的语法更改.我只是不记得它们是什么.

有没有一个很好的参考,再次进行转换,但返回到C?如果它解释了C99(以及后来的?)的变化那就更好了.

c c++ c99

2
推荐指数
1
解决办法
261
查看次数

如何修复此cmake文件? - 链接到导入库的问题

我刚刚开始使用cmake,并尝试建立一个相当简单的项目.虽然项目本身很简单,但它链接到许多不是由cmake构建的静态库.我想它们可能是 - 我们是我的图书馆 - 但我还是要弄清楚如何链接到第三方图书馆.

这是我到目前为止所拥有的......

cmake_minimum_required(VERSION 2.8.1)
cmake_policy(VERSION 2.8.1)

project( test01 )

include_directories("../../cpplib/sh_core" "../../cpplib/sh_core2" "../../cpplib/sh_genlib")

link_directories("../../cpplib/_vc_debug")

add_library( sh_core   STATIC IMPORTED )
add_library( sh_core2  STATIC IMPORTED )
add_library( sh_genlib STATIC IMPORTED )

add_executable( test01 test01 test01_ast test01_parse test01_scan test01_main )
target_link_libraries(test01 sh_core sh_core2 sh_genlib)
Run Code Online (Sandbox Code Playgroud)

问题是我正在尝试链接的三个库未在生成的项目文件中正确引用.它们被列为sh_core-NOTFOUND,sh_core2-NOTFOUNDsh_genlib-NOTFOUND.

也许我不需要link_directories从上面开始,但我需要一个find_library命令.但是我已经快速浏览了文档中的那个命令...... WTF!我已经头疼了,我真的无法应对那些看似多余的复杂ATM.此外,看到这么复杂的东西应该是非常简单的,这告诉我,我正在寻找错误的地方.

那么......我怎么告诉cmake在哪里找到这些库?

奖金问题 - 我如何设置它,以便生成的项目处理调试版本和发布版本?注 - 导入库的发行版具有相同的文件名,但位于"../../cpplib/_vc_release"文件夹中.

cmake

2
推荐指数
1
解决办法
3321
查看次数

在什么情况下C++无法调用继承类的构造函数?

编辑遵循决议,这已被大量编辑,以转储不相关的细节和解释真正的问题.

我最近在一些旧代码中发现了一个问题.特定的代码很少使用,并且没有足够的单元测试(当我发现问题时我添加了更多).我最近才停止使用Visual C++ 2003,并且VC++ 9中没有显示症状,仅在MinGW GCC 4.4.0中显示.并且只发布版本.一旦我添加了任何跟踪代码,症状就会消失.你不喜欢那些吗?

无论如何,事实证明,在所有情况下都没有调用复制构造函数和赋值运算符重载.结果,数据结构变得不一致.大部分时间我都在匆匆忙忙.

我通过VC++ 9调试器逐步查看了这个问题,即使VC++ 9版本没有显示出症状.所以,至少有两个编译器表现相同,即使症状没有表现出来 - 一个公平的暗示,让我不知不觉的行为符合标准,而且我一直依赖于旧的非标准行为.

那么......在什么情况下,继承基类的构造函数等无法被调用?

FWIW,问题代码是导致这个问题的库的一部分.

解析度

有两个单独的问题 - 复制构造和重载分配.

在最近的"命名"变体中,复制构造问题被证明是众所周知的返回值优化问题.涉及的对象是指向多路树叶节点的"游标"(如迭代器).为了确保维护它们,每个叶节点都保留一个引用它的游标的链接列表.

游标是一个非常轻量级的类 - 叶节点指针,节点中的下标和维护列表的下一个指针.需要显式构造/销毁/分配的唯一原因是维护游标列表的副作用.

因为类是如此轻量级,并且因为很少有多个游标(特别是很少有一个或两个游标指向特定的叶节点),我有时会使用按值传递和按值返回.后者似乎是问题所在.

更改副本构造函数实现意外地绕过了这个问题 - 我得到的印象(未经证实)对于发布版本,MinGW GCC和VC++仍然试图避免绕过具有副作用的复制构造函数,但是会遗漏某些副作用.

第二个问题 - 分配过载.我认为,这对我来说是一个古老的愚蠢错误,如果我在大致相同的时间没有复制构造函数问题,我会更快地弄清楚它.

赋值重载是通过两层继承继承的,其中包含一些模板,隐私和依赖类型的复杂性.中间或派生类都没有超越它.在这种特殊情况下,这种有意义(以错误的方式) - 派生类不添加任何成员数据,它只是将模板参数提供给基础并添加一些方法.但是如果标准有特殊情况"我没有添加任何成员数据",我会感到非常惊讶.

对于较旧的编译器,我认为我正在使用隐式转换规则,允许调用基类赋值操作.我不想尝试追踪行为改变的确切原因 - 关键是我因为编写一些杂乱而奇怪的结构化代码而受到惩罚.

c++

2
推荐指数
1
解决办法
242
查看次数

渐近符号 - n(log n)(log n)是否简化?

如果我有一个算法需要n个n步骤(例如heapsort),其中步骤需要log n时间(例如比较/交换0到n-1范围内的"大"整数),什么是渐近界限整个过程.

显然我们可以说"n(log n)(log n)",但是我很难说服自己我不能简化为"n log n".与此同时,我很难证明我坚持自己的本能.

我的直觉在这方面是否完全错误?

编辑

似乎我的简单例子 - 避免 - 复杂化问题使问题复杂化.那好吧.

这个问题的真正原因是我经常使用具有已知复杂性的标准算法,但使用不同的底层容器实现,因此各个步骤是O(log n)而不是O(1).例如,Hopcrofts自动机最小化算法是O(n log n) - 但是如果你开始使用二进制树容器来处理状态,转换和中间结果,那么步骤本身就变成O(log n) - O(n log n)是不再有效,因为O(1)访问的假设无效.

尽管如此,人们会声称存在n个状态和m个转换,但是n和m倾向于与自动机线性相关,假设转换注释的数量是恒定的并且自动机具有或多或少的确定性.

我过去对此并没有太多担心 - 与我合作的案例并不是很大.但是,好吧,我正在对我的自动机代码进行重大的重构,而且我认为我可以正确地为一些关键算法进行数学计算.

编辑

我也越来越相信"n(log n)(log n)"是错误的.

如果a是O(b log b),其中b是O(log c),那么就c而言是什么?

theory algorithm asymptotic-complexity

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