草庐IT

c++ - 返回本地对象是否需要移动语义?

当按值返回本地对象时,C++编译器可能利用移动语义优化掉不必要的拷贝(复制省略)。“可能优化”意味着如果不满足适当的条件,行为应该回退到基于复制的默认按值返回语义。因此,据我了解,按值返回可复制对象始终有效。但是编译器(clang和gcc)似乎不同意我的解释,如下面的MWE所示。classFoo{public:Foo();Foo(constFoo&);Foo(Foo&&)=delete;}Foof(){returnFoo();}//error:calltoexplicitlydeletedconstructorof'Foo'Foog(){Fooa;returna;}//gcccompl

c++ - 使用移动语义将基类实例插入子类实例

假设我有一个实例化的Baseb。Foo是Base的子类。我想要做的是拥有一个Foo的构造函数classFoo:publicBase{Foo(Baseb,TotherArg):Base(b){/*ToDo-dosomethingwithotherArg*/}}将“b”实例移动到正在构建的Foo实例。如果Foo的构造失败(例如,在我的/*ToDo步骤*/中),则不应移动b。我可以在C++11中执行此操作吗?(我买不起深拷贝)。构造函数原型(prototype)是否需要为Foo(Base&&b,TotherArg)? 最佳答案 是的,你可

C++ 限制语义

我正在更新性能关键库以使用restrict,正如在C++11中由g++和MSVC使用关键字__restrict实现的那样。这似乎是最标准的扩展,所以我将交替使用restrict和__restrict。restrict是一个C99关键字,但是编译器已经在C++中定义了它的重要用途。这篇文章打算成为一个“问题”,询问每个C++特定用途是什么以及它意味着什么,然后是CW的答案来回答它。随意添加/检查/编辑。所以:“求助!这些C++对restrict关键字的使用是什么意思?”限定this(限制一个方法):voidFoo::method(int*__restricta)__restrict{/*

c++ - vector 、 move 语义、nothrow 和 g++ 4.7

我编写了以下代码来理解move语义。它在g++-4.6中按预期工作(即没有复制,只move),但在g++-4.7.0中没有。我认为这是g++-4.7.0中链接的错误,但这个link说这不是g++-4.7中的错误。因此,正如我从上面的链接中理解的那样,我使move构造函数不抛出,但它仍然只执行复制。但是,如果我不抛出复制构造函数,则只会发生move。谁能解释一下?#include#includeusingnamespacestd;structS{intv;staticintccount,mcount;S(){}//nothrowconstructor//S(nothrow)(constS

c++ - 在使用单独的规则定义和实例化时,Boost Spirit X3 AST 无法处理语义操作

我正在尝试将BoostSpiritX3与语义操作一起使用,同时将结构解析为AST。如果我使用没有单独定义和实例化的规则,它就可以正常工作,例如:#include#include#include#include#includenamespaceast{structast_struct{intnumber;std::vectornumbers;};}BOOST_FUSION_ADAPT_STRUCT(ast::ast_struct,(int,number)(std::vector,numbers))namespacex3=boost::spirit::x3;usingnamespacest

c++ - C++ 中 move 语义的起源是什么?

我想知道movesemantics的来源是什么在C++中?特别是它是专门为这种语言发明的还是其他语言中有类似的东西?在后一种情况下,您能否提供一些引用。 最佳答案 这个概念似乎没有任何特定的祖先。C++move语义的起源,如theoriginalproposal中所述,是新闻组中的讨论:MovesemanticsinvariousformshasbeendiscussedinC++forums(mostnotablycomp.lang.c++.moderated)foryears.在我看来,它们与C++的左值和右值概念紧密相关,如果

c++ - RVO, move 语义和优化代码的斗争

如果我没看错的话,move语义允许从临时的、未命名的对象中move和重用资源。RVO,尽管之前的move语义更进一步,并“窃取”了整个对象以避免额外的构造函数调用和赋值/复制函数。这对我来说似乎有点违反直觉,如果被调用的构造函数直接使用最终左值目标的地址直接将数据放置在用户需要的位置,不是会更快、更简单且用户显而易见吗?我的意思是,“在这个位置创建这个对象”似乎比“在某个地方创建这个对象,然后将它复制到正确的位置”更直观一些。 最佳答案 是的,它“有点违反直觉”。启用复制省略后,构造函数的所有副作用也将被省略。#includestr

c++ - 非实例化 C++ 模板函数的语义正确性

以下C++代码无法编译,例如使用g++-4.7或clang++-3.2:structBar{};templatevoidfoo(Tt,Barbar){t.compiler_does_not_care();bar.nonexistent_method();}intmain(){}为什么编译器要检查模板函数foo的代码的语义正确性(它们可以),即使它从未被实例化?是否符合该标准? 最佳答案 Bar是一个非依赖的名字(即它的类型不依赖于T),所以编译器需要在第一阶段验证代码的正确性名称查找(请参阅下面的注释)。由于Bar没有nonexis

c++ - Boost Spirit Qi Custom Syntesized Attribute(通过语义操作设置结构属性的特定成员)

假设我有一个我想用灵气解析成的结构,它是这样定义的:structdata_{boolexport;std::wstringname;data_():export(false){}};此外,假设结构已适应这样的融合:BOOST_FUSION_ADAPT_STRUCT(data_,(bool,export)(std::wstring,name))关联的规则是:qi::rule>rule_data;rule_data=-lexeme["SpecialText">>!(alnum|'_')][boost::phoenix::at_c=true]//Ifthisstringisfound,,se

实时语义分割---PIDNet论文笔记

PIDNet是2022年发表在CVPR上的实时语义分割网络,在推理速度和准确性之间实现了最佳平衡,其中该系列的PIDNet-S在Cityscapes测试集上达到93.2FPS+78.6%mIOU。论文和开源代码在这里。解决的问题:传统双分支网络低层的细节信息和高层语义信息直接融合,会导致细节特征很容易被上下文信息淹没,即文中的overshoot。思路:提出一种三分支网络架构,分别解析细节、上下文和边界信息,并设计边界注意力引导融合模块(Bag)融合三个分支的特征。图1Cityscapes测试集中实时分割模型推理速度与准确度之间的权衡为了在推理速度和准确度之间取得最佳平衡,研究人员投入了大量精力