草庐IT

弱引用

全部标签

c++ - put_money 是按值还是按引用保存其参数?

以下是否会调用未定义的行为?#include#include#include#includeintmain(){longdoublevalues[]={1,2,3};std::transform(std::begin(values),std::end(values),std::experimental::make_ostream_joiner(std::cout,","),[](longdoublev){returnstd::put_money(v+1);});return0;}我担心的是returnstd::put_money(v+1)返回对临时v+1的引用。

C++:多线程和引用计数对象

我目前正在尝试将单线程程序传递给多线程。该软件大量使用“refCounted”对象,这会导致多线程中出现一些问题。我正在寻找一些设计模式或可能解决我的问题的东西。主要问题是线程之间的对象删除,通常删除只会减少引用计数,当refcount为零时,对象就会被删除。这在单线程程序中运行良好,并且通过复制大对象可以显着提高性能。然而,在多线程中,两个线程可能想同时删除同一个对象,因为对象受互斥量保护,只有一个线程删除对象并阻塞另一个线程。但是当它释放互斥锁时,另一个线程会继续执行无效的(已释放的对象),这会导致内存损坏。这是一个RefCountedObject类的例子classRefCount

c++ - Lambda:为什么按值捕获的值是常量,但按引用捕获的值不是?

为什么按值捕获的值是常量,但按引用捕获的对象不是:inta;autocompile_error=[=](){a=1;}autocompiles_ok=[&](){a=1;}对我来说这似乎不合逻辑,但它似乎是标准?特别是因为对捕获值的不必要修改可能是一个恼人的错误,但后果仅限于lambda范围的可能性很高,而通过引用捕获的对象的不必要修改通常会导致更严重的影响。那么为什么不默认通过const引用捕获呢?或者至少支持[const&]和[&]?这样设计的原因是什么?作为解决方法,您可能应该使用std::cref包装的按值捕获的const引用? 最佳答案

c++ - 为什么 boost::filesystem::path::string() 在 Windows 上按值返回,而在 POSIX 上按引用返回?

来自boost/filesystem/path.hpp:#ifdefBOOST_WINDOWS_APIconststd::stringstring()const{[...]}#else//BOOST_POSIX_API//string_typeisstd::string,sothereisnoconversionconststd::string&string()const{returnm_pathname;}[...]#endif对于wstring()来说恰恰相反——在Windows上通过引用返回,在POSIX上通过值返回。这有什么有趣的原因吗? 最佳答案

c++ - C++ 迭代器是否持有对底层对象的引用?

我似乎找不到太多关于迭代器是否保留它们正在迭代的底层对象的信息。如果我创建了一个迭代器,那么提供它的对象超出了范围,迭代器的存在是否会阻止它被销毁?这里有一个非常简单的例子来说明这个场景://ThisclasstakesacopyofiteratorstousethemlaterclassData{public:Data(std::vector::iteratorstart,std::vector::iteratorend):start(start),end(end){}voidshow(){//Usethis->startandthis->endforsomepurpose}priv

c++ - 从代码中引用 CMAKE 变量

我在Windows上使用CMAKE3.4.3,我想做的是在CMAKE中设置一个路径,并尝试在我的C++文件中引用它。我的尝试如下:在CMakeLists.txt文件中ADD_DEFINITIONS(-DNV12_2_ARGB_PTX_DIR"${CMAKE_CURRENT_SOURCE_DIR}/ptx")现在,我尝试从我的C++文件中引用它,如下所示:#ifdefNV12_2_ARGB_PTX_DIR#definePTX_DIRD_NV12_2_ARGB_PTX_DIR#endif当我尝试将其称为:std::cout我得到错误:'C:/Users/Luca/project/src/l

c++ - 为什么 std::atomic 的 compare_exchange 会引用期望值?

std::atomic::compare_exchange_*的原因是什么?通过引用获取期望值,而不是通过值获取期望值? 最佳答案 如果操作失败,compare_exchange_*会将expected更改为实际值。它使循环更简单一些。 关于c++-为什么std::atomic的compare_exchange会引用期望值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1998

c++ - 通过引用传递派生类到以基类为参数的函数

考虑以下代码:classA{public:virtual~A(){}virtualvoidprint()const{std::coutprint();}voiddoSomething(constAa){a.print();}intmain(){A*a=newB();doSomething(a);doSomething(B());return0;}为什么会这样输出:InBInA但是当您将doSomething更改为doSomething(constA&a)时,它会输出:InBInB 最佳答案 这称为切片。当按值传递A时,通过仅复制调用

c++ - STD 馆藏中引用文献的生命周期

对STD集合返回的元素(例如map)的引用有效多长时间?例如,在这段代码中:structEmployee{intsalary;stringname;//thekey};mapallemployees;...Employee&Joe=allemployees["JoeSmith"];Joe.salary=150;//change"JoeSmith"'ssalaryassert(allemployees["JoeSmith"].salary==150);//alwaystrue....allemployees["MarkJones"]=Employee();...//No"JoeSmith

c++ - 不通过引用传递简单类型的原因?

据我所知,您不应该在C++中通过引用传递简单类型,因为它不会提高性能,甚至对性能不利(?)。至少那是我设法从网上收集到的。但我无法找出它对性能不利的原因,是因为C++只创建一个新的简单类型比查找变量更快还是什么是吗? 最佳答案 如果您创建一个引用,它是:pointertomemorylocation->memorylocation如果你使用一个值,它是:memorylocation由于必须以任何一种方式(引用或值)复制值,因此通过引用传递不会提高性能;必须进行一次额外的查找。因此,理论上它会“恶化”性能,但不会恶化到您会注意到的程度