小编orm*_*orm的帖子

std :: function的仅移动版本

因为std::function是可复制的,所以标准要求用于构造它的callables也是可复制的:

n337(20.8.11.2.1)

template<class F> function(F f);

要求:F应为CopyConstructible.f对于参数类型ArgTypes和返回类型,应为Callable(20.8.11.2)R.A的拷贝构造函数和析构函数不会抛出异常

这意味着不可能std::function从不可复制的绑定对象或捕获仅移动类型的lambda形成std::unique_ptr.

似乎可以为仅移动的callables实现这样一个仅移动的包装器.是否存在标准库仅限移动等效std::function或者,是否存在针对此问题的常见解决方法?

c++ move-semantics c++11

51
推荐指数
3
解决办法
6242
查看次数

左值隐式转换的左值

我看到整个C++标准中许多地方使用的术语"左值到右值转换".据我所知,这种转换通常是隐含的.

标准中的一个意外(对我来说)特征是他们决定将左值作为转换处理.如果他们说glvalue总是可以接受而不是prvalue怎么办?这句话实际上会有不同的含义吗?例如,我们读到lvalues和xvalues是glvalues的例子.我们没有读到lvalues和xvalues可以转换为glvalues.意义上有区别吗?

在我第一次遇到这个术语之前,我曾经或多或少地对lvalues和rvalues进行了如下建模:"lvalues 总是能够充当rvalues,但另外还可以出现在左侧=和右侧&".

对我来说,这是一个直观的行为,如果我有一个变量名,那么我可以将该名称放在我想放置文字的地方.此模型似乎与标准中使用的左值到右值隐式转换术语一致,只要保证发生此隐式转换即可.

但是,因为他们使用这个术语,我开始想知道在某些情况下是否可能无法进行隐式左值到右值转换.也就是说,也许我的心理模型在这里是错误的.以下是该标准的相关部分:(感谢评论者).

每当glvalue出现在期望prvalue的上下文中时,glvalue就会转换为prvalue; 见4.1,4.2和4.3.[注意:尝试将rvalue引用绑定到左值不是这样的上下文; 见8.5.3 .-结束说明]

我理解他们在说明中描述的内容如下:

int x = 1;
int && y = x; //in this declaration context, x won't bind to y.
// but the literal 1 would have bound, so this is one context where the implicit 
// lvalue to rvalue conversion did not happen.  
// The expression on right is an lvalue. if it had been a prvalue, it would have bound.
// Therefore, the lvalue …
Run Code Online (Sandbox Code Playgroud)

c++ implicit-conversion lvalue-to-rvalue c++11

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

是否有LLVM IR的调试器?

我想介绍一下我生成的一些LLVM IR代码.就llc和lli而言,代码在语法和类型上是有效的,但结果不是我所期望的.

这些块足够大,以至于我只是简单地读出了这个bug,而且我很难用相同的bug生成一个更小的例子.

我认为我可以使用类似调试器的东西,但是对于LLVM IR.换句话说,我希望能够逐步执行llvm代码,检查"无限"寄存器(给定LLVM IR文件中的名称)和内存位置,设置断点,直到找到我的代码出错的地方.

我看着llilldb,但也好像是我要寻找的工具.lli将运行我的代码,但不要让我一步一步走.lldb似乎假设代码是由C前端生成的.

我错了约lldblli?有谁知道一个工具甚至可以达到我想要的50%?

llvm llvm-ir

13
推荐指数
2
解决办法
1716
查看次数

为什么英特尔公布的一些Haswell AVX延迟比Sandy Bridge慢3倍?

在英特尔内部网络应用程序中,从Sandy Bridge到Haswell的几项操作似乎已经恶化.例如,许多插入操作(如_mm256_insertf128_si256)显示如下的成本表:

   Performance
 Architecture   Latency   Throughput
 Haswell        3         -
 Ivy Bridge     1         - 
 Sandy Bridge   1         - 
Run Code Online (Sandbox Code Playgroud)

我发现这种差异令人费解.这有什么不同,因为有新的指令可以取代这些或补偿它的东西(哪些)?有谁知道Skylake是否进一步改变了这个模型?

x86-64 intel simd cpu-architecture avx2

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

github推送事件有效负载中提交'distinct'标志的含义

通过github API,PushEvents类别包括一个提交列表和一个github在事件发生时分配的时间.PushEvent描述文档声明属性commits[][distinct]指示

此提交是否与之前推送的任何提交不同.

这表明只有一个事件条目,其中提交被标记为'distinct'标志设置为True作为Github看到它们的最早时间,并且此类事件将具有最早的时间戳与任何其他具有该提交的事件相比.

但是,我发现一些提交在多个不同的推送事件通知中被标记为"不同",并且标记为'distinct'= False的提交实际上可能出现在早期事件中,而不是那些被标记为'True'的事件.

这是为什么?我误解了"独特"旗帜的含义吗?

github github-api

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

是否有针对intel avx2中的movemask指令的反向指令?

movemask指令采用__m256i并返回int32,其中每个位(取决于输入向量元素类型的前4位,8位或所有32位)是相应向量元素的最高有效位.

我想做反过来:取一个32(其中只有4,8或32个最低有效位有意义),并获得__m256i,其中每个int8,int32或int64大小的块的最高有效位设置为原始位.

基本上,我想从压缩的位掩码转到可被其他AVX2指令(例如maskstore,maskload,mask_gather)用作掩码的位掩码.

我无法快速找到这样做的指令,所以我在这里问.如果没有一条具有该功能的指令,您是否可以想到一个聪明的黑客,只需很少的指令即可实现这一点?

我目前的方法是使用256元素查找表.我想在一个没有其他事情发生的循环中使用这个操作来加速它.注意,我对长多指令序列或实现此操作的小循环不太感兴趣.

x86 icc intrinsics avx avx2

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

将标志传递给亚历克斯和快乐通过堆栈

我正在尝试将项目从cabal移动到堆栈.直到我试图让亚历克斯使用自定义包装器时,它才是无痛的.现在我被卡住了.

我以前使用cabal build --alex-options =".."来传递它们,但是那个选项不存在堆栈(至少堆栈版本1.1.2).同样,我曾经把调试标志传递给happy,但是现在它似乎不再可能了.有没有其他方法来实现这一点,仍然使用堆栈?

移动这个项目的目的是帮助协作者能够毫不费力地重现我的构建(说服他们使用Haskell已经有了一些工作).

haskell cabal-install haskell-stack

8
推荐指数
0
解决办法
242
查看次数

神秘的rtm使用haswell tsx中止

我正在尝试使用haswell中的tsx扩展,通过调整现有的中型(1000行)代码库来使用GCC事务内存扩展(在本机中间接使用haswell tsx)而不是粗粒度锁.我正在使用GCC的transactional_memory扩展,而不是直接编写我自己的_xbegin/_xend.我正在使用ITM_DEFAULT_METHOD = htm

我遇到问题让它工作得足够快,因为我因为神秘的原因而导致高速率的硬件事务中止.如下所示,这些中止不是由于冲突,也不是由于容量限制.

这是我用来量化失败率和根本原因的perf命令:

perf stat \
 -e cpu/event=0x54,umask=0x2,name=tx_mem_abort_capacity_write/ \
 -e cpu/event=0x54,umask=0x1,name=tx_mem_abort_conflict/ \
 -e cpu/event=0x5d,umask=0x1,name=tx_exec_misc1/ \
 -e cpu/event=0x5d,umask=0x2,name=tx_exec_misc2/ \
 -e cpu/event=0x5d,umask=0x4,name=tx_exec_misc3/ \
 -e cpu/event=0x5d,umask=0x8,name=tx_exec_misc4/ \
 -e cpu/event=0x5d,umask=0x10,name=tx_exec_misc5/ \
 -e cpu/event=0xc9,umask=0x1,name=rtm_retired_start/ \
 -e cpu/event=0xc9,umask=0x2,name=rtm_retired_commit/ \
 -e cpu/event=0xc9,umask=0x4,name=rtm_retired_aborted/pp \
 -e cpu/event=0xc9,umask=0x8,name=rtm_retired_aborted_misc1/ \
 -e cpu/event=0xc9,umask=0x10,name=rtm_retired_aborted_misc2/ \
 -e cpu/event=0xc9,umask=0x20,name=rtm_retired_aborted_misc3/ \
 -e cpu/event=0xc9,umask=0x40,name=rtm_retired_aborted_misc4/ \
 -e cpu/event=0xc9,umask=0x80,name=rtm_retired_aborted_misc5/ \ 
./myprogram -th 1 -reps 3000000
Run Code Online (Sandbox Code Playgroud)

因此,该程序运行一些代码,其中包含3000万次交易.每个请求都涉及一个事务gcc __transaction_atomic块.此次运行中只有一个线程.

此特定perf命令捕获英特尔软件开发人员手册第3卷中描述的大多数相关tsx性能事件.

输出perf stat如下:

             0 tx_mem_abort_capacity_write                                  [26.66%]
             0 tx_mem_abort_conflict                                        [26.65%]
    29,937,894 tx_exec_misc1                                                [26.71%] …
Run Code Online (Sandbox Code Playgroud)

c++ x86-64 transactional-memory intel gcc4.8

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

使用menhir进行多次错误报告:哪个令牌?

我正在用Menhir + Ocamllex写一个小解析器,我有两个要求,我似乎无法同时满足

  • 我想在发生错误后继续解析(报告更多错误).
  • 我想打印发生错误的令牌.

我只能通过使用error令牌轻松地做到1).我也可以使用针对此问题建议的方法轻松地做到2).但是,我不知道实现这两者的简单方法.

我现在处理错误的方式是这样的:

pair:
| left = prodA SEPARATOR right = prodA { (* happy case *) }
| error SEPARATOR right = prodA { print_error_report $startpos;
(* would like to continue after the first error, just in case
   there is a second error, so I report both *) }
Run Code Online (Sandbox Code Playgroud)

有一件事可以帮助我访问lexbuf本身,所以我可以直接获得令牌.这将意味着,而不是$startpos我传的东西一样 $lexbuf,但据我所知,有访问lexbuf没有官方途径.1中的解决方案仅在解析器的调用者级别工作,其中调用者本身将lexbuf传递给解析器,但不在语义操作中.

有谁知道它是否真的以某种方式可用?或者可能是一种解决方法?

ocaml ocamlyacc ocamllex menhir

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

perf 带注释的程序集似乎已关闭

我想测量 C++ 原子 fetch_add 在不同设置下花费的时间。我写了这样的东西:

atomic<uint64_t> x(0);
for (uint64_t i = 0; i < REPS; i+=1g) {
  x.fetch_add(1);
} 
Run Code Online (Sandbox Code Playgroud)

因此,如果REPS足够高,我认为能够对fetch_add发生的情况。首先,我需要验证大部分时间确实花费在 fetch_add 中,而不是循环开销等。所以我运行 perf 来做到这一点。

这是来自 objdump 的程序集:

400ed0:       b8 00 b4 c4 04          mov    $0x4c4b400,%eax
400ed5:       0f 1f 00                nopl   (%rax)
400ed8:       f0 83 05 7c 22 20 00    lock addl $0x1,0x20227c(%rip)
400edf:       01 
400ee0:       83 e8 01                sub    $0x1,%eax
400ee3:       75 f3                   jne    400ed8 <_Z10incrsharedv+0x8>
Run Code Online (Sandbox Code Playgroud)

perf (对于周期事件)表示 100% 的周期进入,这与我所期望的或跳跃sub $0x1,%eax相反。lock addl $0x1,0x20227c(%rip) …

c++ x86 c++11 perf

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

T*和const T*

我相信这可能适用于许多T,但我知道这适用于整数.作为学习C++的一部分,我试图用标准中的语言来解释以下行为.

typedef const int * constintptr;
typedef int * intptr;

intptr p;
constintptr cp = p;
const constintptr& crcp = p;
//constintptr & rcp = p;
Run Code Online (Sandbox Code Playgroud)

从查看n3337,第8.5.3节.看来这种行为可以解释为int*可以转换为const int*prvalue,但不兼容引用.(如果我错了,请纠正我).

我看到这是理想的行为(或者我们可以颠覆const),这种行为的可取性不是这个问题的意思.

问题是在标准中指定(或暗示)它们的intptr和constintptr不是参考兼容的.

c++ pointers const c++11

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

在Haskell中对大型DAG结构进行Eq测试

我是Haskell的新手(几个月).我有一个Haskell程序,它组装一个大表达式DAG(不是树,DAG),可能很深,并且有多个合并路径(即,从根到叶的不同路径的数量很大).我需要一种快速的方法来测试这些dag是否相等.默认的Eq推导只会递归,多次探索相同的节点.目前这导致我的程序对于相对较小的表达式需要60秒,而对于较大的表达式甚至不能完成.分析器指示它正忙于在大多数时间检查相等性.我想实现一个没有这个问题的自定义Eq.我没有办法解决这个不涉及大量重写的问题.所以我想听听你的想法.

我的第一次尝试是使用Data.Hashable.hash我在构建树时使用我逐步计算的哈希"检测"树节点.这种方法给了我一个简单的方法来测试两个不相等的东西而不深入研究结构.但通常在这个DAG中,由于DAG合并中的路径,结构确实相等.所以哈希是平等的,我恢复全面的平等测试.

如果我有办法实现身体平等,那么我的很多问题都会消失:如果它们在物理上是平等的,那就是它.否则,如果哈希值不同,那就是它.只有在物理上不一样的情况下才会更深入,但他们的哈希同意.

我也可以模仿git,并计算每个节点的SHA1以确定它们是否是相等的周期(无需递归).我知道这会有所帮助,因为如果我在哈希等式方面完全决定等式,那么程序在几十毫秒内运行最大的表达式.这种方法还有一个很好的优点,即如果由于某种原因有两个相等的dag在物理上不相同但是内容相等,那么我也能够在这种情况下快速检测到它.(对于Ids,Id仍然需要在那时进行遍历).所以我更喜欢语义.

然而,这种方法涉及的工作比调用Data.Hashable.hash函数要多得多,因为我必须为dag节点类型的每个变体派生它.而且,我有多个dag表示,节点定义略有不同,所以如果我决定添加更多表示,我需要基本上做两次或更多的散列技巧.

你会怎么做?

haskell

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