草庐IT

double-checked-locking

全部标签

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

基本上是这样的(不是真正的代码):for(inti=0;iv0.pos类型为Vector3,但可能是Vector3.这样做安全吗?:Vector3center=(v0.pos+v1.pos)*0.5;这似乎是不成熟的优化,但它必须尽可能快,以便在数十亿点(点云)上调用。 最佳答案 无论如何都不是C++专家,但在C#中,这样做:vara=newFunc((floatf1,floatf2)=>(f1+f2)*0.5);varb=newFunc((floatf1,floatf2)=>(f1+f2)/2);在前者中生成IL:加载参数添加它们

c++ - optional<double> 可以实现为 8 字节对象吗?

是否可以实现std::optional这样sizeof(std::optional)==8通过某种方式使用它可以将字符存储在NAN中,请参阅http://en.cppreference.com/w/cpp/numeric/math/nan?有实现吗?可以根据标准中提供的功能来完成吗? 最佳答案 我不认为这是可以做到的,因为没有规则阻止程序自己利用和依赖NaN中的额外位。然后,如果您将魔数(MagicNumber)存储到optional中,它看起来就像不存在,而不是应用程序的特殊NaN。

c++ - BOOST_CHECK_EQUAL(和衍生品)添加自定义消息

我们最近开始使用BoostTest框架,到目前为止很喜欢它。但是,在某些测试中,如果我们可以将自定义消息添加到现有帮助程序,那将会很棒。例如,我可以在mytest和mytest2中获取输出,但在mytest3中找不到输出:#defineBOOST_TEST_MODULEmytests#includeBOOST_AUTO_TEST_SUITE(myunit)BOOST_AUTO_TEST_CASE(mytest){//Thisgiveaniceoutput[2+2!=5]BOOST_CHECK_EQUAL(2+2,5);}BOOST_AUTO_TEST_CASE(mytest2){//T

C++ - 如何正确地将 double 转换为 int

我目前正在编写一个需要对平方根取底的程序。因为我取平方根的值是正数,所以我只是将它转换为int。所以说下面的例子:inti=16;intj=std::sqrt(i)j应该是4。不过我想知道,sqrt是否有可能返回3.9999999991而不是4.000000001或其他什么,而j的结果是3?是否有定义浮点行为的规则?我怎样才能正确地将其转换为int? 最佳答案 几乎所有广泛使用的硬件都使用IETF754float,尽管C++不需要它。假设IETF754float和::std::sqrt到IETF754浮点平方根运算的直接映射,您可以

c++ - 交换 float 和 double 的 "endianness"

我想切换float和double值的“字节顺序”,它可以正常工作,方法如下:floatconstv{1.f};swap(reinterpret_cast(v));是否有更好的方式来进行交换,无需强制转换?编辑:swap()是gcc内置函数的C++包装器,我没有在此处包含它。uint16_t__builtin_bswap16(uint16_tx)uint32_t__builtin_bswap32(uint32_tx)uint64_t__builtin_bswap64(uint64_tx)某些数据格式需要字节顺序交换,例如CBOR。 最佳答案

C++ weak_ptr.lock() 段错误

所以我有这个函数来添加监听器,它转换一个类的共享指针,以便我稍后在收到通知时可以调用它。voidregisterListener(std::shared_ptrlistener){if(!listener){qCWarning(OBSERVER_LOGGER)lock()){if(listener==shared){return;}iter++;}else{iter=listeners.erase(iter);}}autoweak=std::weak_ptr(listener);listeners.push_back(weak);}voidnotify(std::function)>o

c++ - vector<double> 比 double* : why? 快

这是我用std::vector试过的一个循环和普通的旧double*.对于1000万个元素,vector版本的运行时间是double*的大约80%。版本需要;对于N的几乎任何值,vector明显更快。查看GCCSTL源代码,我没有看到std::vector正在做任何比double*本质上更有趣的事情习语正在做(即,使用普通旧new[]分配,operator[]取消引用偏移量)。Thisquestion也是这么说的。知道为什么vector版本更快吗?Compiler:GCC4.6.1Examplecompileline:g++-Ofast-march=native-DNDEBUG\-ft

python - 将 C++ double 返回给 Python?

所以我使用python调用共享C++库中的方法。我在将double从C++返回到python时遇到问题。我创建了一个展示问题的玩具示例。请随意编译并试用。这是python代码(soexample.py):#PythonimportsfromctypesimportCDLLimportnumpyasnp#OpensharedCPPlibrary:cpplib=CDLL('./libsoexample.so')cppobj=cpplib.CPPClass_py()#Stuckonconvertingtoshort**?x=cpplib.func_py(cppobj)print'x=',x这

c++ - 将 int 值添加到 double 时是否有性能优势/惩罚?

给定vector加法:NPNumberNPNumber::plus(constdoubleo)const{vectorc;for(doublea:values)c.push_back(a+o);returnNPNumber(width,c);}如果NPNumber包含一个doublevector(字段值),当我只添加一个整数而不是另一个NPNumber时,与转换该整数并使用上面的函数相比,是否有性能优势或损失?也就是说,这在任何架构上是更快还是更慢:NPNumberNPNumber::plus(constinti)const{vectorc;for(doublea:values)c.p

c++ - C++11 中的 BOOST scoped_lock 替换

我面临这样一种情况,我必须用C++11中的等效项替换BOOSTscoped_lock。在visualstudio2013下。由于c++11不支持scoped_lock,我不确定下面的替换代码是什么。我应该选择lock_guard还是try_lock?boost::mutex::scoped_lockobjectLock(ObjectVectorMutex,boost::try_to_lock);if(objectLock){//...}在代码中我有以下“等待”语句if(ObjectsCollection.empty()){//Thisiswherewewaittilsomethingi