Haskell没有显式内存管理功能,所有对象都是按值传递的,所以也没有明显的引用计数或垃圾回收.Haskell编译器通常如何决定是否生成在堆栈上分配的代码与在堆上为给定变量分配的代码?是否一致堆或堆栈为同一个函数在不同的调用站点分配相同的变量?当它分配时,它如何决定何时释放内存?堆栈分配和解除分配是否仍在与C中相同的功能入口/出口模式中执行?
我有一个正则表达式的容器.我想分析它们以确定是否可以生成匹配多于1个的字符串.在编写我自己的正则表达式引擎时,考虑到这个用例,是否有一种简单的方法可以用C++或Python来解决这个问题?
我读到某处(无法找到页面)锁定免费数据结构对于"某些工作负载"更有效,这似乎意味着有时它们实际上更慢或者在某些情况下它们的增益可能为零.对锁定指令进行大约100次循环命中来执行原子操作听起来要快得多,而不是等待调度程序将进程重新唤醒,所以对于我来说,在什么情况下无锁数据结构不是很明显比旧式的互斥体更不可取.如果锁定在99%的时间内可用且进程无需进入休眠状态,那么互斥锁会更快吗?假设有合适的无锁数据结构,是否有一个很好的经验法则可以知道哪条路可用?
在C++ 0x中,您可以使用using关键字继承构造函数,如下所示:
class B { B(int) {} };
class A : public B { using B::B; };
Run Code Online (Sandbox Code Playgroud)
这将隐式声明一个A(int)构造函数.这适用于模板吗?
class B { B(int) {} };
template<class T> class A : public T { using T::T; };
Run Code Online (Sandbox Code Playgroud)
在内部T::T,我希望编译器找出左手,T因为在模板参数上使用范围运算符是正常的,但是确定右手T是构造函数是一种特殊情况.事实上,它似乎有歧义:如果我有一个名为方法T中B,我试图以重载在增加A(这是一个编译器会如何解释这种使用预申报的C++ 0x)?
在英特尔手册的RDTSC指令警告说,当实际执行RDTSC乱序执行可以改变,所以他们建议将在它前面的CPUID指令,因为CPUID将序列指令流(CPUID是永远不会乱序执行).我的问题很简单:如果他们有能力进行序列化指令,他们为什么不进行RDTSC序列化?它的全部要点似乎是获得周期精确的时间.是否存在一种情况,您不希望在它之前加上序列化指令?
较新的Intel CPU具有单独的序列化RDTSCP指令.英特尔选择引入一个单独的指令,而不是改变RDTSC的行为,这表明我必须存在一些可能出现故障时序的情况.它是什么?
我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
就实际的低级原子指令和内存栅栏而言(我假设它们已被使用),您如何实现STM?
对我来说神秘的部分是,给定一些任意代码块,您需要一种方法可以在之后返回并确定每个步骤中使用的值是否有效.你是怎么做到的,你如何有效地做到这一点?这也似乎表明,就像任何其他"锁定"解决方案一样,您希望保持关键部分尽可能小(以减少冲突的可能性),我是对的吗?
此外,STM可以简单地检测"在执行计算时进入该区域的另一个线程,因此计算无效"或者它是否可以实际检测是否使用了破坏的值(因此运气时有时两个线程可以同时执行相同的临界区需要回滚)?
例如,如果我std::mt19937在GCC和MSVC下使用完全相同的种子和参数实例化a ,我应该得到相同的随机数序列吗?如果是这样的话,我认为这个属性通常适用于mersenne_twister_engine,因为mt19937只是一个具有特定参数的属性.这rand()在C中是不正确的.看起来标准文档是根据特定代码应用的转换,所以我怀疑它应该始终是相同的,但是魔鬼在细节中......
你如何设置一个git存储库,一些用户可以看到源代码的某些部分,其他用户可以看到所有这些?我已经看到很多指南只给予某些用户提交访问权限,但是这些指南假设每个人都应该具有读访问权限.我也听说过gitosis,但我不确定它是否支持这个并且它在一年多没有任何提交,所以我认为它已经死了.
作为一个越来越熟悉Java的C++程序员,看到语言级别支持锁定任意对象而没有任何声明对象支持这种锁定,这有点奇怪.为每个对象创建互斥锁似乎是一个自动选择的高成本.除了内存使用,互斥体在某些平台上是OS有限的资源.如果互斥锁不可用但你的性能特征明显不同,你可以旋转锁定,我希望这会损害可预测性.
在所有情况下,JVM是否足够智能以识别特定对象永远不会成为synchronized关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但是这会引发自举需要互斥锁的自举问题,即使解决了这个问题,我也认为仍然需要一些开销来跟踪是否已经创建了互斥锁.所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成.在C++中,由于编译模型这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对Java的编译和链接知道不够了解如果适用相同的限制.
c++ ×4
atomic ×2
c++11 ×2
standards ×2
x86 ×2
x86-64 ×2
algorithm ×1
assembly ×1
constructor ×1
cpu-cycles ×1
git ×1
haskell ×1
heap ×1
inheritance ×1
java ×1
jvm ×1
lock-free ×1
mutex ×1
overlap ×1
performance ×1
python ×1
random ×1
regex ×1
repository ×1
scheduling ×1
security ×1
stack ×1
stm ×1