小编ein*_*ica的帖子

存储和传递std :: function的 - 按值或按引用?

我无法知道何时通过值或引用传递/存储std :: function对象,或者我需要以某种方式使用移动语义.我有一个存储两个std::function对象的结构:

struct Control{
    char key;
    std::function<void()> press;
    std::function<void()> release;
    Control(char key, std::function<void()> press, std::function<void()> release):
        key(key),press(press),release(release){}
}
Run Code Online (Sandbox Code Playgroud)

我还有一个包含这些结构的向量的类,我想在类似于这个结构的函数中初始化它:

void Screen::init(Player& player){

    this->controls.push_back(Control(
        'W',
        [&player](){player.go(UP);},
        [&player](){player.stop(UP);}));

}
Run Code Online (Sandbox Code Playgroud)

我希望能够将lambda表达式直接传递给Control构造函数,并最终重复执行此操作:

void Screen::update(){
    foreach (auto control : controls){
        if(...) 
            control.press();
        else if (...) 
            control.release();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了很多错误和崩溃试图实现这个想法,所以我需要知道

  • 是否应该std::function通过(const?)引用或值来存储,考虑到它们捕获引用?
  • 它们应该通过(const?)引用或值传递给Control构造函数(或以某种方式移动)?
  • 是否可以通过这种方式将控件按值存储在矢量中,或者我是否需要使用替代(unique_ptr<Control>等等)?
  • 当我遍历控件向量时,我应该通过值或引用来访问它们吗?

假设Player&对象始终在范围内Screen::update().

c++ functor c++11 std-function

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

为什么Boost.Asio不支持基于事件的界面?

我试图了解Boost.Asio,意图使用条件变量和Boost.Asio来实现信号系统.

我已经看到其他StackOverflow问题提升asio异步等待条件变量,boost :: asio异步条件boost条件变量问题,但这些问题/答案都没有令人满意地触及我的一个基本问题:是真的吗那和/或是否存在一个根本原因,Boost.Asio不适用于条件变量,或者与条件变量自然吻合?

我的想法是条件变量是使用操作系统级同步对象在内部实现的(例如,Windows上的boost :: thread :: condition_variable使用Windows操作系统信号量).因为,根据我目前的理解,boost :: asio :: io_service旨在封装操作系统级别的同步对象,因此条件变量似乎很自然.

确实,与文件操作和套接字操作不同,在操作系统级别通常从不存在与信号条件相关联的回调函数(我认为 - 我不确定这一点).但是,在Boost.Asio中实现这样的回调处理程序似乎很简单,只需要用户提供一个回调函数,该函数在条件变量发出信号时被调用 - 正如用户必须为其他函数提供完成处理程序例程一样. boost :: asio :: io_service服务.

例如(这只是一个快速思考,而不是一个完整的原型 - 它没有包含足够的参数来处理notify_one()与notify_all(),也没有说明服务如何知道何时退出,并且可能有其他明显的遗漏或缺陷):

void condition_handler_function() {}
boost::asio::io_service service;
boost::mutex mut;
boost::condition_variable cond;

// The following class is **made up by me** - would such a class be a good idea?
boost::asio::io_service::condition_service
             condserv(service, cond, mut, condition_handler_function); 

condserv.async_wait_on_signal();

service.run(); // when condition variable is signaled by notify_one(),
               // …
Run Code Online (Sandbox Code Playgroud)

c++ boost event-handling boost-asio

7
推荐指数
2
解决办法
5367
查看次数

atomic_compare_exchange用大于而不是等于?

C++ 11对原子变量进行了"比较和交换"操作.

语义是:

原子比较值指向obj与所述值所指向的expected,并且如果这些都是相等,取代了以前使用desired(执行读-修改-写操作).否则,加载实际值所指向的obj进入*expected(进行负载操作).

我想做同样的事情,但不是*obj在值相等时设置,而是希望在一个大于另一个时设置它(假设我们正在谈论一个有序类型).

这是以某种方式支持的吗?也许可以通过一些黑客实现?

注意: CAS循环不适用于我,因为我正在比较的两个值可能在非原子操作之间发生变化.

c++ atomic compare-and-swap c++11

7
推荐指数
2
解决办法
4404
查看次数

OpenCL中不允许使用可变长度数组声明 - 为什么?

我想在我的OpenCL内核中创建一个本地数组,其大小取决于内核的参数.似乎不允许 - 至少在AMD APP上.

你的经历与众不同吗?也许它只是APP?或者这里有一些理由吗?

编辑:我现在建议在CPU端代码中也应该允许变长数组,这是C标准委员会的一个不幸的调用; 但问题是.

memory arrays memory-management c99 opencl

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

独立的便携式snprintf(),独立于标准库?

我正在为目标平台编写代码NO C-runtime.No stdlib,no stdio.我需要一个字符串格式化函数,snprintf但应该是able to run without any dependencies,甚至不是C库.

最多可能取决于memory alloc functions我提供的.

我检查了Trio但它需要stdio.h header.我不能用这个.

编辑

目标平台:( PowerPC64 home made OS不是我).但是,库不应该依赖于OS特定的东西.

EDIT2

我尝试过一些第三方开源库,比如Trio(http://daniel.haxx.se/projects/trio/),snprintf和miniformat(https://bitbucket.org/jj1/miniformat/src)但是所有这些都依赖于像string.h,stdio.h或者(甚至更糟糕的)stdlib.h这样的头文件.如果已经存在,我不想编写自己的实现,因为这会耗费时间并且容易出错.

c embedded printf portability cross-platform

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

nVidia RDMA GPUDirect是否始终仅运行物理地址(在CPU的物理地址空间中)?

我们知道:http://en.wikipedia.org/wiki/IOMMU#Advantages

IOMMU可以支持外围存储器分页.使用PCI-SIG PCIe地址转换服务(ATS)页面请求接口(PRI)扩展的外设可以检测并发出对内存管理器服务的需求.

在此输入图像描述

但是当我们使用CUDA> = 5.0的nVidia GPU时,我们可以使用RDMA GPUDirect,并且知道:

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works

传统上,使用CPU的MMU作为内存映射I/O(MMIO)地址,将BAR窗口等资源映射到用户或内核地址空间.但是,由于当前的操作系统没有足够的机制来在驱动程序之间交换MMIO区域,因此NVIDIA内核驱动程序会导出函数以执行必要的地址转换和映射.

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems

从PCI设备的角度来看,GPUDirect的RDMA当前依赖于所有物理地址是相同的.这使它与IOMMU不兼容,因此必须禁用它们才能使RDUD for GPUDirect正常工作.

如果我们将CPU-RAM分配并映射到UVA,如下所示:

#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

int main() {
    // Can Host map memory
    cudaSetDeviceFlags(cudaDeviceMapHost);  

    // Allocate memory
    unsigned char *host_src_ptr = NULL;
    cudaHostAlloc(&host_src_ptr, 1024*1024, cudaHostAllocMapped);
    std::cout << "host_src_ptr = " << (size_t)host_src_ptr << std::endl;

    // Get UVA-pointer
    unsigned int *uva_src_ptr = NULL;
    cudaHostGetDevicePointer(&uva_src_ptr, host_src_ptr, 0);
    std::cout << "uva_src_ptr  = " << (size_t)uva_src_ptr << std::endl;

    int b; …
Run Code Online (Sandbox Code Playgroud)

cuda gpgpu memory-mapping pci-e gpudirect

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

我可以将doxygen解析为@ ref到C++标准库函数吗?

我有时想在我的doxygen评论中提到标准库构造.我可以使用HTML <a>元素执行此操作- 但这是要粘贴的大量文本.我宁愿能简单地写{@ref std::string},并有doxygen的知道它需要链接到cppreference.org 页面std::string.

我想也许如果有人要为标准库生成一个doxygen标签文件(如果标签文件不支持任意URL,那么这可能不起作用)也许是可能的.那么,还有另一种方法吗?

c++ doxygen code-documentation

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

CMake多选项设置

我正在开发一个用CMake构建的项目,所以我正在CMakeLists.txt为它编写一个.在这个文件中,我想要一个(缓存的)CMake变量,它只能采用几个选项之一(我会以某种方式指定),而不是任意字符串.为简单起见,让我们把它变成一个可以采用"红色","绿色"或"蓝色"的字符串 - 但没有别的.

我可以使用最近的CMake版本来实现这一点,除了设置任意字符串然后检查其有效性吗?

build cmake multiple-choice multiplechoicefield

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

“读取调试信息时出现严重错误”-抑制?忽略?使固定?

我正在使用 valgrind 尝试查找 C-cum-C++ 程序中内存访问违规的原因。即使避免了这种访问(即当一切运行正常时),valgrind 告诉我:

==11436== Memcheck, a memory error detector
==11436== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==11436== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==11436== Command: bin/monetdb-bp-reader /home/eyalroz/dbfarms/monetdb/tpch-sf-1
==11436== 
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Ignoring non-Dwarf2/3/4 block in .debug_info
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Last block truncated …
Run Code Online (Sandbox Code Playgroud)

valgrind memcheck debug-information

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

这是“省略失败”语言规定的吗?

考虑以下代码:

#include <utility>
#include <string>

int bar() {
    std::pair<int, std::string> p { 
        123, "Hey... no small-string optimization for me please!" };
    return p.first;
}
Run Code Online (Sandbox Code Playgroud)

(简化感谢@ Jarod42 :-) ...)

我希望该功能可以简单地实现:

bar():   
        mov eax, 123
        ret
Run Code Online (Sandbox Code Playgroud)

但是,实现调用operator new(),std::string用我的文字构造 an ,然后调用operator delete(). 至少 - 这就是 gcc 9 和 clang 9 所做的(GodBolt)。这是铛的输出:

bar():                                # @bar()
        push    rbx
        sub     rsp, 48
        mov     dword ptr [rsp + 8], 123
        lea     rax, [rsp + 32]
        mov     qword ptr [rsp …
Run Code Online (Sandbox Code Playgroud)

c++ stdstring compiler-optimization language-lawyer elision

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