小编kfm*_*e04的帖子

如何在两个容器的元素之间执行成对二进制操作?

假设我有两个std::vector<uint_32> a, b;我知道具有相同大小的向量.

是否有一个C++ 11范式做一个bitwise-AND所有成员之间ab,并把结果std::vector<uint_32> c;

c++ algorithm libstdc++ c++11

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

如何使用variadic完美转发到lambda?

我有一个调用lambda的工作函数模板.

我想概括这个函数模板来获取可变参数并将它们完美地转发到lambda中,但是我无法编译这段代码.

我正在使用gcc 4.7.2.

UPDATE

使用R. Martinho Fernandes的建议,我查找了bugzilla中的错误 - 它看起来像一个已经存在一段时间的bug.如果有人知道一个解决方法(我现在正在挖掘一个),请发一个答案 - ty.

错误

junk.cpp: In lambda function:
junk.cpp:32:68: error: parameter packs not expanded with ‘...’:
junk.cpp:32:68: note:         ‘args’
junk.cpp: In instantiation of ‘std::pair<std::basic_string<char>, typename T::Lambda> MP(const string&, M, Args&& ...) [with T = Integer; M = int (Integer::*)()const; Args = {}; typename T::Lambda = std::function<std::function<int()>(const Integer&)>; std::string = std::basic_string<char>]’:
junk.cpp:47:42:   required from here
junk.cpp:34:2: error: using invalid field ‘MP(const string&, M, Args&& ...)::<lambda(const T&)>::__args’
make: *** [junk] Error 1 …
Run Code Online (Sandbox Code Playgroud)

c++ lambda binding variadic-templates c++11

18
推荐指数
2
解决办法
4253
查看次数

什么时候使用std :: promise比其他std :: thread机制更好?

我正在尝试建立一些启发式方法来帮助我确定std::thread要使用的适当类.

据我了解,从最高级别(最简单到使用,但最不灵活)到最低级别,我们有:

  1. std :: async with/std :: future(std :: shared_future)(当你想在一次性丢弃的生产者线程async上执行时)
  2. std :: packaged_task(当你想分配一个生产者,但是把调用推迟到线程)
  3. std :: promise(???)

我想我对何时使用前两个有一个很好的把握,但我仍然不清楚std::promise.

std::futurestd::async调用一起,有效地将生成的回调/函数/ lambda转换为异步调用(根据定义,它立即返回).一个单一的消费者可以拨打std::future::get()阻止电话,以获得结果.

std::shared_future 只是一个允许多个消费者的版本.

如果要将std::future值与生成器回调绑定,但希望将实际调用推迟到以后(将任务关联到生成线程时),std::packaged_task则是正确的选择.但是现在,由于对应std::futurestd::package_taskcan,在一般情况下,可以由多线程访问,我们可能必须小心使用a std::mutex.请注意std::async,在第一种情况下,我们不必担心锁定.

阅读了一些关于承诺的有趣链接,我想我理解它的机制以及如何设置它们,但我的问题是,你什么时候会选择使用其他三个承诺呢?

我正在寻找一个应用程序级别的答案,比如一个经验法则(填写上面的???),而不是链接中的答案(例如使用std :: promise来实现一些库机制),所以我可以更容易地解释如何为初级用户选择合适的类std::thread.

换句话说,这将是很好有什么我可以用做一个有用的例子std::promise不能与其他机制来完成.

回答

A std::future是一种奇怪的野兽:一般来说,你不能直接修改它的值.

可以修改其价值的三个生产者是:

  1. std::async通过异步回调,它将返回一个std::future实例.
  2. std::packaged_task,当传递给线程时,将调用其回调,从而更新std::future与之关联的实例std::packaged_task.此机制允许生成器的早期绑定,但稍后调用.
  3. std::promise,允许std::future通过其 …

c++ c++11 stdthread

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

如何让CMake使用go编程语言?

我一直在使用CMake和C++来构建库和可执行文件,并希望将其用于go编程语言.

我需要采取哪些步骤来配置CMake才能使用go编程语言?

基本上,我的编译器是6g,它产生一个编译的foo.6.我通过6l foo.6将它发送到一个链接器,我就完成了.我已经构建并安装了编译器和链接器.

显然,我可以为此编写一个简单的Makefile,但在整个项目中使用CMake会很好.

TIA提供任何可以帮助我入门的建议.

cmake go

16
推荐指数
2
解决办法
6959
查看次数

使用googletest进行基准测试?

背景(如果不感兴趣,请跳至下面的问题)

我有一个运行三种状态的模拟器:

  1. 单线程启动(I/O ok)
  2. 多线程内存CPU绑定仿真阶段(I/O不行)
  3. 后仿真,后连接单线程阶段(I/O ok)

有没有搞错! 在标准测试期间,CPU使用率从100%下降到20%,总运行时间比正常时间长30倍(130秒与4.2秒).

Callgrind没有发现任何可疑的事情时,我的头嗡嗡作响,因为我正在回到最后一次提交的悬崖上,失去了所有的错误修复.

气馁,我在跑步期间走进服务器机房,注意到讨厌的磨音,后来验证是由于/ proc/PID/fd中的 Mysql套接字写入造成的!事实证明,第2阶段深层的几层Mysql代码导致了问题.

得到教训

  1. 意外I/O对于实时应用程序可能是致命的
  2. 单元测试还不够:我也需要基准测试

修复 我将在ReadAllowed()和WriteAllowed()上引入线程本地存储IOSentinels和asserts(),以确保Stage 2线程永远不会执行任何IO.

任何人都有幸与googletest附加/编写基准测试框架?

不幸的是,这次我的所有googletests都通过了.如果我稍稍离开并在没有注意到运行时间的情况下回来,这将是一个灾难性的提交,并且可能更难修复.

如果运行时间超过上次运行时的2或3倍,我希望googletest失败:这最后一部分很棘手,因为对于非常快速的运行,系统状态可能导致某些事情需要两倍的时间但仍然可以.但是对于长时间的模拟运行/测试,我不希望运行时间变化很大(> 50%会不常见).

我对这里的建议持开放态度,但是对于自动化测试进行低维护检查会很好,所以即使所有输出看起来都没问题,系统突然变慢也很明显.

c++ benchmarking googletest

14
推荐指数
2
解决办法
9614
查看次数

如何使用std :: is_integral <>来选择实现?

我试图返回int64_tif std::is_integral<>::value是真的.

否则,我想打电话to_int64t()给对象.

我在下面的尝试失败,因为不允许部分特殊化功能模板.

#include <type_traits>
#include <cstdint>

template<class T,bool is_integral_type>
int64_t to_int64t( const T& t )
{
        return t;
}

template<class T>
int64_t to_int64t<T,std::is_integral<T>::value>( const T& t )
{
        return t;
}

template<class T>
int64_t to_int64t<T,!std::is_integral<T>::value>( const T& t )
{
        return t.to_int64t();
}

int main()
{
        int64_t i = 64;
        auto x = to_int64t( i );
}
Run Code Online (Sandbox Code Playgroud)

c++ templates type-traits c++11

14
推荐指数
2
解决办法
7549
查看次数

如何将元组<>重新删回到可变参数类型的模板列表中?

有没有办法去除一个std::tuple<T...>以便让它回来T...

假设vct<T...>是一个预先存在的 可变参数类模板,

using U = std::tuple<int,char,std::string>;
using X = vct<int,char,std::string>;
using Y = vct< strip<U> >;            // should be same as X
Run Code Online (Sandbox Code Playgroud)

笔记

我知道std :: tuple_element,但我需要所有元素,以一种可用的形式T...

作为参考,我发现这个问题,这是类似的,但我的需求是较为简单(所以我希望有一个简单的解决方案):我需要的是那些在类型列表tuple-我不关心tuple实例的实际值.

c++ templates std variadic-templates c++11

13
推荐指数
3
解决办法
3995
查看次数

C++:shared_ptr <>的普遍使用是否等同于gc?

这只是一个学术问题(我不会在实际代码中这样做):

如果我在我的代码中普遍使用shared_ptr <>,那么行为是否等同于Java之类的gc收集语言?

如果不是,行为将如何与gc嵌入式语言不同?与gc嵌入式语言相比,哪种C++构造会产生相同的行为?

注意:在实际编码中,我更倾向于使用RAII和严格的所有权来使用任何智能指针.我也知道其他不太通用的指针,unique_ptr <>会更有效率.这个问题只是对智能指针等价的一个问题.

c++ java garbage-collection smart-pointers

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

drd和helgrind的当前状态支持std :: thread

当我将代码转换为C++ 11时,我非常希望将我的pthread代码转换为std :: thread.但是,我似乎在drd和helgrind中的非常简单的程序中获得了错误的竞争条件.

#include <thread>

int main(int argc, char** argv)
{
    std::thread t( []() { } );
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Helgrind输出片段 - 我在drd中也遇到类似的错误,在Ubuntu 11.11 amd64上使用gcc 4.6.1,valgrind 3.7.0.

我的问题是:

  • 理智检查:我做错了什么?其他人是否在简单的std :: thread程序上得到类似的错误报告?
  • 用于检测竞争条件的std :: thread的当前用户是什么?

我不愿意将大量代码从pthread移植到std::threadhelgrind/drd等一些关键工具.

==19347== ---Thread-Announcement------------------------------------------
==19347== 
==19347== Thread #1 is the program's root thread
==19347== 
==19347== ---Thread-Announcement------------------------------------------
==19347== 
==19347== Thread #2 was created
==19347==    at 0x564C85E: clone (clone.S:77)
==19347==    by 0x4E37E7F: do_clone.constprop.3 (createthread.c:75)
==19347==    by 0x4E39604: pthread_create@@GLIBC_2.2.5 (createthread.c:256)
==19347==    by 0x4C2B3DA: pthread_create_WRK (hg_intercepts.c:255)
==19347== …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading race-condition c++11

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

对于构造函数,如何在variadic-templates和std :: initializer_list之间进行选择?

在c ++ 11的当前状态(比如gcc 4.7.2)中,我应该如何选择使用variadic-template还是std::initializer_list需要可以接受变量参数的构造函数?

c++ templates initializer-list variadic-templates c++11

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