小编bwe*_*ber的帖子

使用std :: forward vs std :: move

我一直认为std::forward这只适用于模板参数.但是,我问自己为什么.请参阅以下示例:

void ImageView::setImage(const Image& image){
    _image = image;
}

void ImageView::setImage(Image&& image){
    _image = std::move(image);
}
Run Code Online (Sandbox Code Playgroud)

这两个功能基本上是一样的; 一个采用l值参考,另一个采用r值参考.现在,我认为,std::forward如果参数是l值引用,则应返回l值引用,如果参数为1,则应返回r值引用,此代码可简化为如下所示:

void ImageView::setImage(Image&& image){
    _image = std::forward(image);
}
Run Code Online (Sandbox Code Playgroud)

这类似于cplusplus.com提到的示例std::forward(只是没有任何模板参数).我想知道,如果这是正确与否,如果不是为什么.

我也问自己究竟会有什么区别

void ImageView::setImage(Image& image){
    _image = std::forward(image);
}
Run Code Online (Sandbox Code Playgroud)

c++ move forward c++11

53
推荐指数
3
解决办法
2万
查看次数

CUDA:如何使用-arch和-code以及SM vs COMPUTE

在使用nvcc构建时,我仍然不确定如何正确指定代码生成的体系结构.我知道我的二进制文件中嵌入了机器代码和PTX代码,这可以通过控制器开关-code-arch(或两者的结合使用-gencode)来控制.

现在,根据除了两种编译器标志也有指定架构方法有两种:sm_XXcompute_XX,其中compute_XX指的是虚拟和sm_XX一个真正的架构.该标志-arch仅采用虚拟体系结构的标识符(例如compute_XX),而-code标志采用真实和虚拟体系结构的标识符.

该文档指出了-arch指定为其编译输入文件的虚拟体系结构.但是,此PTX代码不会自动编译为机器代码,但这是一个"预处理步骤".

现在,-code应该指定汇编和优化PTX代码的架构.

但是,不清楚哪个PTX或二进制代码将嵌入二进制文件中.例如-arch=compute_30 -code=sm_52,如果我指定,这是否意味着我的代码将首先被编译为功能级别3.0 PTX,之后将创建功能级别5.2的机器代码?什么将被嵌入?

如果我只是说明-code=sm_52会发生什么呢?只嵌入V5.2的机器代码是用V5.2 PTX代码创建的?那有什么区别-code=compute_52

cuda nvcc fat-binaries ptx

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

C++:编译器能否优化价值传递?

一种通常已知的编译器优化是所谓的返回值优化.此优化基本上允许编译器不复制从函数返回的局部变量,而是复制它.

但是,我想知道如果已知函数的返回值将覆盖原始参数,是否也可以通过值将参数传递给函数.

这是一个例子.我们假设我们有以下功能:

std::vector<Foo> modify(std::vector<Foo> data) {
    /* Do some funny things to data */
    return data;
}
Run Code Online (Sandbox Code Playgroud)

然后以下列方式使用此函数:

std::vector<Foo> bigData = /* big data */;
bigData = modify(bigData); // Here copying the data into the function could be omitted
Run Code Online (Sandbox Code Playgroud)

现在,在这种情况下,可以清楚地确定函数调用的返回值将覆盖每个值传递给函数的参数.我的问题是当前的编译器是否能够以某种方式优化此代码,以便data在传递给函数时不会复制参数,或者这甚至可能是所谓的返回值优化的一部分.

更新

我们考虑C++ 11.我想知道以下理解是否正确:如果通过值传递给函数参数的值是r值,并且参数的类型具有移动构造函数,则将使用移动构造函数而不是复制构造函数.

例如:

std::vector<Foo> bigData = /* big data */;
bigData = modify(std::move(bigData));
Run Code Online (Sandbox Code Playgroud)

如果这是假设是正确的,这将在传递值时消除复制操作.从已经给出的答案看来,我之前提到的优化似乎并不常见.看看这种手动方法,我真的不明白为什么,因为看起来非常简单易用.

c++ optimization parameter-passing return-value-optimization

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

String Literal的模板参数演绎

我目前正在考虑如何最好地将通用类型的模板约束到std::sting字符串文字.因此,我使用推断的类型与所需的类型进行比较std::is_same.如果std::string这是立即工作.对于字符串文字,意思是char const数组,它只有在我使用std::decay该类型然后将结果与类型进行比较时才有效char const *.如果我直接将推导出的类型与我认为的类型进行比较,则is_same返回false,如下面的示例代码所示.

template <class TYPE>
void function(TYPE&& parameter)
{
  //this doesn't work as expected
  std::cout << typeid(TYPE).name() << " : " << typeid(char const [5]).name() << std::endl;
  std::cout << std::is_same<char const [5], TYPE>::value << std::endl;
  //this works as expected
  std::cout << typeid(std::decay_t<TYPE>).name() << " : " << typeid(char const *).name() << std::endl;
  std::cout << std::is_same<char const *, std::decay_t<TYPE>>::value << std::endl;
}

int main(int argc, char** argv) …
Run Code Online (Sandbox Code Playgroud)

c++ templates string-literals perfect-forwarding c++11

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

jQuery FadeIn / FadeOut错误-fadeTo正常工作

我已经认识到jQuery fadeIn()函数的行为,这对我来说似乎是错误的。

这些代码片段应等效:

function fadeIn1(){
    $("#fadediv1").stop(true).fadeIn(2000); 
}

function fadeOut1(){
    $("#fadediv1").stop(true).fadeOut(2000);            
}
Run Code Online (Sandbox Code Playgroud)

和:

function fadeIn2(){
    $("#fadediv2").stop(true).fadeTo(2000, 1);  
}

function fadeOut2(){
    $("#fadediv2").stop(true).fadeTo(2000, 0);          
}
Run Code Online (Sandbox Code Playgroud)

但是实际上示例1的行为很奇怪。我创建了一个示例页面,您可以在其中进行自我测试:http : //neo1.fomalhaut.uberspace.de/virtualGuitar/example.html

上一个是不能正常工作的。如果使用鼠标输入红色div,则蓝色div将开始渐入。将其保留在渐入时,将其保留。现在,它将停止渐入并逐渐消失。如果现在重新输入它,虽然它逐渐消失了,但是它将冻结,尽管它应该再次开始逐渐消失。但是事实并非如此。

在下面的示例中,一切都按我的预期工作,在这里我使用了fadeTo函数。

现在有人可以告诉我我是对的,并且不应该发生此行为,因为fadeIn和fadeOut就像带有目标透明度的1和0的fadeTo一样?还是我弄错了,由于某种原因,应该是这样吗?

JQuery版本是最新版本(1.7.2),已在Chrome,Firefox和Opera中进行了测试。

javascript jquery fadeout

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

c ++:为其他函数锁定互斥锁但本身可以并行执行的函数

我有一个关于线程安全和互斥锁的问题。我有两个可能无法同时执行的函数,因为这可能会导致问题:

std::mutex mutex;

void A() {
    std::lock_guard<std::mutex> lock(mutex);
    //do something (should't be done while function B is executing)
}

T B() {
    std::lock_guard<std::mutex> lock(mutex);
    //do something (should't be done while function A is executing)
    return something;
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,函数 A 和 B 不应该同时执行。这就是我使用互斥锁的原因。但是,如果从多个线程同时调用函数 B 是完全没问题的。但是,这也被互斥锁阻止了(我不想要这个)。现在,有没有办法确保 A 和 B 不会同时执行,同时仍然让函数 B 并行执行多次?

c++ parallel-processing multithreading mutex

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

如何使用 Qt 防止 QCursor::setPos() 上的 mouseMoveEvent?

我目前正在开发图像查看器应用程序。在此应用程序中,我有一个所谓的“平移缩放”功能。这意味着,当按住某个鼠标按钮时,用户可以通过前后平移来缩放图像。

它工作正常,但随着该功能的使用,鼠标(自然地)在屏幕上上下移动,并在某个时刻到达屏幕边框,这将使其停止。相反,我想要一种鼠标保持静止并且仅图像放大倍数发生变化的行为。

我尝试通过调用QCursor::setPos内部来实现此目的QWidget::mouseMoveEvent,并在处理移动后将鼠标重置到初始位置。只要鼠标几乎保持静止(前后摆动),它就可以工作。但是,这将导致再次调用鼠标移动事件,从而有效地取消我刚刚所做的调整。这将导致“摆动”效果。每一次调整都会立即逆转。

这是一个代码片段,这样您就可以了解我在做什么:

void ImageView::mouseMoveEvent(QMouseEvent *e) {
    //some code
    if (_panZooming) {
        //some code here

        //doesn't work as expected because it invokes this event again
        QCursor::setPos(mapToGlobal(_initialMousePosition.toPoint()));
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法防止使用时发生鼠标移动事件QCursor::setPos

c++ qt mouse-position qcursor

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

在运行时在本地启用/禁用OpenMP

是否可以在运行时启用或禁用OpenMP并行化?我有一些代码应该在某些情况下并行运行,而不是在不同情况下并行运行.同时,在其他线程中还有其他计算也使用OpenMP,并且应始终并行运行.有没有办法告诉OpenMP不要在当前线程中并行化?我知道omp_set_num_threads,但我认为全局设置OpenMP使用的线程数.

c c++ multithreading openmp

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

Windows:如何使用 Certum 颁发的证书对 exe 进行签名?

我的目标是使用证书在 Windows 上签署一个未签名的可执行文件。根据我的一般知识,我知道我需要一个公钥和一个私钥对来进行数字签名。我还安装了 Windows SDK,它提供signtool.exemakecert.exe.

我已经在线获得了证书,包括 CER、PEM 和 CRT 文件。

我现在的问题是我必须如何使用这些工具和证书文件来签署可执行文件。根据这里,CRT 文件是私钥。从我目前了解到的情况来看,CER 和 PEM 文件基本相同,但编码不同。它们是干什么用的?它们是公钥吗?以及如何签署我的可执行文件?

编辑:我尝试将 CRT 文件安装到证书存储区,然后使用该证书进行签名:

"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /debug /fd SHA256 /a /n "<Issued_To>" /t http://timestamp.comodoca.com/authenticode <Filename>
Run Code Online (Sandbox Code Playgroud)

这里<Issued_To>用证书中的数据替换,<Filename>是我要签名的文件的名称。我从 signtool 得到的输出如下:

The following certificates were considered:
    ...

    Issued to: ...
    Issued by: Certum Code Signing CA SHA2
    Expires:   Thu Oct 12 14:37:04 2017
    SHA1 hash: BA081A67D3F2DDDC9268121DCBA04F43D6CD37FB

    ...

After EKU filter, 1 certs were left.
After expiry …
Run Code Online (Sandbox Code Playgroud)

windows code-signing certificate digital-signature

5
推荐指数
2
解决办法
2469
查看次数

确定可以连续分配的最大 GPU 设备内存量

我目前正在开发一个 CUDA 应用程序,如果处理的数据足够大,它将使用尽可能多的全局设备内存 (VRAM)。我分配的是一个 3D 卷cudaMalloc3d,所以我使用的内存必须是连续的。为此,我尝试使用该函数检索空闲设备内存的数量,cudaMemGetInfo然后分配尽可能多的空闲内存。但是,这似乎不起作用。尝试分配该数量的内存时,我仍然遇到错误。

现在,我的问题是是否有办法检索我可以连续分配的最大设备内存量。

一种选择是试错法,我反复减少我尝试分配的数量,直到分配成功。但是,我不太喜欢这个想法。

背景:我有一个程序可以在 GPU 上进行锥束 CT 重建。这些卷可能会变得非常大,因此我在必要时将它们分成块。因此,我必须知道一个块最多可以有多大才能仍然适合全局设备内存。

memory memory-management cuda

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