草庐IT

c++ - 编译器是否避免中间整数提升或转换?

考虑这样一个类:structmystruct{constexproperatorchar(){returnx;}signedcharx;};和这样的操作:mystructm;m.x=/*somethingatruntime*/inti=3*m+45ULL*m;编译器是否可以跳过临时转换为char并直接将m转换为3*m+45ULL*m中所需的类型>表达? 最佳答案 似乎GCC版本5.3.0能够优化对cast函数的调用,而Clang3.7就没那么聪明了。对于这段代码:structmystruct{constexproperatorcha

c++ - 设计建议——返回子类时避免 "invalid covariant return type"

我有以下情况:我指定一个纯虚函数:虚拟PredictedMatchPredictMatch(constMatch&match)const=0;我还有:类ImpactPredictedMatch:publicPredictedMatch现在,我想做的是:ImpactPredictedMatchPredictMatch(constMatch&match)const;在一个实现了之前的纯虚函数的类中。我原以为编译器会根据需要简单地转换返回的类型,但我得到:impact_predictor.h:18:24:错误:“虚拟ImpactPredictedMatchImpactPredictor::P

c++ - SFINAE 没有避免模棱两可的调用

编译这段代码:#includetemplatestructTestClass{template::type=0>voiddoAction(){std::cout();\n";}};structHostClass:publicTestClass,publicTestClass{};intmain(intargc,constchar*argv[]){HostClasshostClass;hostClass.doAction();hostClass.doAction();return0;}导致不明确的调用错误,因为doAction都在TestClass中和TestClass父类。main.c

c++ - 避免对非虚拟析构函数进行对象切片

我正在为智能指针编写代码作为练习。使用在线教程(1,2)我开发了一个带有引用计数的普通智能指针类。问题是我无法弄清楚以下内容:whenthesmartpointerdetectsthatnomorereferencesexisttoaparticularobject,itmustdeletetheobjectviaapointertotheoriginaltype,evenifthetemplateargumentofthefinalsmartpointerisofabasetype.Thisistoavoidobjectslicingfornon-virtualdestructors

c++ - 避免使用 DirectXMath XMStore/load

我以前做过OpenGL,现在正在学习一些DirectX11。新数学库中的一件事是存在用于vector和矩阵的加载/存储方法(例如http://msdn.microsoft.com/en-us/library/ee415635(v=vs.85).aspx)。对我来说,这让我很奇怪,当我想使用它们时必须存储/加载每个vector和矩阵-很多笨重的代码-我想知道是否有任何好的、干净的替代加载/存储过程? 最佳答案 你可以看看simplemath如果有帮助的话。它现在是DirectXTK的一部分.来自链接站点:WhywrapDirectXM

c++ - 如何在编译期间避免标准包含文件

我正在尝试使用我自己的printf函数,所以我不想包含标准包含文件...所以我正在使用-nostdinc编译我的代码我创建的程序是这样的:externintprintf(constchar*,...);printf("Value:%d",1234);//printf("\n");这段代码工作正常,但是当我使用printf("\n")时,它显示undefinedreferenceto'putchar'。如果我评论printf("\n");然后显示nm命令$nmtest1.oUexit00000000TmainUprintf00000030T_start但是如果我使用printf("\n"

c++ - 避免对象切片 C++

我有一个问题,我想复制一个对象,但又想避免切片。DerivedObjderivedObj;myFunc(derivedObj);voidmyFunc(MyObj&obj){MyObj*saveForLater=newMyObj(obj);//slicesmyobject//...//}有办法解决这个问题吗?我确实需要制作一个拷贝,因为原始对象在需要它之前将离开范围。 最佳答案 如果您的限制条件允许,您可以添加一个虚拟的Clone方法。classMyObj{public:virtualMyObj*Clone()const=0;};cl

c++ - 如何避免语法相同的 const 和语义不相同的非 const 函数之间的代码重复

#includeusingnamespacestd;classA{public:A():x(0){}//notice:notidenticaltoconstversionbutdoesupdatevoidFA(){std::cout首先,对于冗长的标题感到抱歉。如何避免函数FC,FCconst中类C中的代码重复?鉴于您不能使用将this转换为const并从非constFC版本调用constFC版本的技巧,因为非constFC的主体实际上将调用以下函数将进行更新,并且与它们相应的常量不相同。 最佳答案 让模板成员函数完成实际工作。换句

c++ - 提取原始数据,然后将其传递给另一个类——如何在保持封装的同时避免复制两次?

考虑一个classBook使用classPage的STL容器.每个Page拿着截图,比如page10.jpg在原始vector形式。ABook使用包含这些屏幕截图的zip、rar或目录的路径打开,并使用相应的方法提取原始数据,如ifstreaminFile.read(buffer,size);,或unzReadCurrentFile(zipFile,buffer,size).然后调用Page(constchar*stream,intfilesize)构造函数。现在,很明显原始数据被复制了两次。一次解压到Book的本地buffer第二次在PagePage::vector的构造器.有没有办

c++ - 在 hashmap/unordered_map 中,当 value 已经包含 key 时,是否可以避免数据重复

给定以下代码:structItem{std::stringname;intsomeInt;stringsomeString;Item(conststd::string&aName):name(aName){}};std::unordered_mapitems;Item*item=newItem("testitem");items.insert(make_pair(item.name,item);项目名称将在内存中存储两次-一次作为项目结构的一部分,一次作为map条目的键。是否可以避免重复?对于大约100M的记录,这种开销变得巨大。注意:我需要在Item结构中包含名称,因为我使用hash