我无法知道何时通过值或引用传递/存储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?)引用或值来存储,考虑到它们捕获引用?unique_ptr<Control>等等)?假设Player&对象始终在范围内Screen::update().
我试图了解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++ 11对原子变量进行了"比较和交换"操作.
语义是:
原子比较值指向
obj与所述值所指向的expected,并且如果这些都是相等,取代了以前使用desired(执行读-修改-写操作).否则,加载实际值所指向的obj进入*expected(进行负载操作).
我想做同样的事情,但不是*obj在值相等时设置,而是希望在一个大于另一个时设置它(假设我们正在谈论一个有序类型).
这是以某种方式支持的吗?也许可以通过一些黑客实现?
注意: CAS循环不适用于我,因为我正在比较的两个值可能在非原子操作之间发生变化.
我想在我的OpenCL内核中创建一个本地数组,其大小取决于内核的参数.似乎不允许 - 至少在AMD APP上.
你的经历与众不同吗?也许它只是APP?或者这里有一些理由吗?
编辑:我现在建议在CPU端代码中也应该允许变长数组,这是C标准委员会的一个不幸的调用; 但问题是.
我正在为目标平台编写代码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这样的头文件.如果已经存在,我不想编写自己的实现,因为这会耗费时间并且容易出错.
我们知道: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) 我有时想在我的doxygen评论中提到标准库构造.我可以使用HTML <a>元素执行此操作- 但这是要粘贴的大量文本.我宁愿能简单地写{@ref std::string},并有doxygen的知道它需要链接到cppreference.org 页面的std::string.
我想也许如果有人要为标准库生成一个doxygen标签文件(如果标签文件不支持任意URL,那么这可能不起作用)也许是可能的.那么,还有另一种方法吗?
我正在开发一个用CMake构建的项目,所以我正在CMakeLists.txt为它编写一个.在这个文件中,我想要一个(缓存的)CMake变量,它只能采用几个选项之一(我会以某种方式指定),而不是任意字符串.为简单起见,让我们把它变成一个可以采用"红色","绿色"或"蓝色"的字符串 - 但没有别的.
我可以使用最近的CMake版本来实现这一点,除了设置任意字符串然后检查其有效性吗?
我正在使用 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) 考虑以下代码:
#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)