草庐IT

double-dispatch

全部标签

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++ - 编译时分派(dispatch) : conditional on valid call

给定以下代码:templateclassJoinedObjectGroup:public_ObjectSpaceHolder,public_ObjectSpaceHolder{public:JoinedObjectGroup(GroupA&groupA,GroupB&groupB):_ObjectSpaceHolder(groupA),_ObjectSpaceHolder(groupB){}templateObjectTypeget(){//Dispatchtoappropriatehandler:onlyoneofthefollowingactuallycompilesas//eit

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++ - 如何正确地将 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++ - 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

c++ - C++ 中具有多个可访问参数的访问者模式

考虑以下层次结构:classBase{virtualvoidMethod()=0;virtualvoidAccept(Visitor*iVisitor)=0;};classDerived1:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visit(this);}};classDerived2:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visi

带有模板参数的 C++ 函数分派(dispatch)

我正在重构一个大类——我们称它为Big——它有大量的复制粘贴代码。大部分复制粘贴代码都存在于switchcase中,其中只有涉及的类型最终有所不同。代码根据类的enum成员变量进行切换,该类的值仅在运行时才知道。我试图解决这个问题涉及到有一个Dispatcher类,它通过一个名为lookup()的static函数查找适当类型的函数。执行实际工作的函数总是称为go()并且必须在包装类模板中定义(其唯一参数是当前正在打开的运行时enum值).go()函数本身可能是也可能不是模板函数。这是代码的精简版。对于篇幅,我深表歉意,但这是我在不丢失重要上下文的情况下所能做到的最短。#includec

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