Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。


7
传递值然后移动构成一个坏习惯吗?
由于我们在C ++中具有移动语义,因此如今很常见 void set_a(A a) { _a = std::move(a); } 理由是,如果a是右值,则副本将被删除,并且只有一招。 但是,如果a是左值会怎样?似乎将有一个副本构造,然后是一个移动分配(假设A具有正确的移动分配运算符)。如果对象具有太多的成员变量,则移动分配的成本可能很高。 另一方面,如果我们这样做 void set_a(const A& a) { _a = a; } 将只有一份副本分配。如果我们要传递左值,是否可以说这种方法比按值传递惯用法更可取?

5
为什么要使用std :: async?
在尝试使用std :: async并阅读其定义的同时,我试图深入探索新C ++ 11标准的所有选项,我注意到至少在gcc 4.8.1的Linux下有两件事: 它称为async,但它确实具有“顺序行为”,基本上在您调用与async函数foo相关联的future的行中,该程序将阻塞直到foo执行完毕。 它取决于与其他库完全相同的外部库以及更好的非阻塞解决方案,这意味着pthread,如果要使用std::async,则需要pthread。 在这一点上,我很自然地问为什么甚至在一组简单的函子上都选择std :: async?该解决方案甚至根本无法扩展,您调用的未来越多,程序的响应性就越差。 我想念什么吗?您能否显示一个示例,该示例被授予以异步,非阻塞方式执行?

9
在C / C ++中获得正模的最快方法
通常,在我的内部循环中,我需要以“环绕”方式为数组建立索引,以便(例如)如果数组大小为100,并且我的代码要求输入元素-2,则应将其赋值为元素98。高级语言(例如Python)可以使用轻松实现my_array[index % array_size],但是由于某些原因,C的整数算术(通常)会舍入为零而不是始终舍入,因此,当给定第一个负数时,其模运算符将返回负数。 我常常知道这index不会少于-array_size,在这种情况下我会做到my_array[(index + array_size) % array_size]。但是,有时无法保证,对于这些情况,我想知道实现始终为正的模函数的最快方法。有几种“智能”方式可以做到而无需分支,例如 inline int positive_modulo(int i, int n) { return (n + (i % n)) % n; } 要么 inline int positive_modulo(int i, int n) { return (i % n) + (n * (i < 0)); } 当然,我可以对它们进行概要分析以找出哪个是系统上最快的,但是我不禁担心自己可能错过了更好的系统,或者我的计算机上的速度在另一台计算机上可能较慢。 那么,有没有一种标准的方法来执行此操作,或者我错过了一些巧妙的技巧,而这可能是最快的方法? 另外,我知道这可能是一厢情愿的想法,但是如果有一种方法可以自动矢量化,那就太神奇了。
70 c++  c  performance 

4
那将是“你好,世界!” 例如“ std :: ref”?
有人可以举一个简单的例子来演示功能std::ref吗?我的意思是一个示例,其中仅在无法解释时才使用其他一些构造(如元组或数据类型模板)的例子std::ref。 我在std::ref 这里和这里发现了两个问题。但是在第一个中,它涉及编译器中的错误;在第二个中,std::ref它不包含使用示例,std::ref它们涉及元组和数据类型模板,这使得对这些示例的理解变得复杂。
70 c++  c++11  std  ref 

7
如何将协变返回类型与智能指针一起使用?
我有这样的代码: class RetInterface {...} class Ret1: public RetInterface {...} class AInterface { public: virtual boost::shared_ptr<RetInterface> get_r() const = 0; ... }; class A1: public AInterface { public: boost::shared_ptr<Ret1> get_r() const {...} ... }; 此代码无法编译。 在Visual Studio中,它引发了 C2555:覆盖虚拟函数的返回类型不同并且不是协变的 如果我不使用boost::shared_ptr而是返回原始指针,则代码会编译(我理解这是由于C ++中的协变返回类型所致)。我可以看到这个问题是因为boost::shared_ptr的Ret1不是源自boost::shared_ptr的RetInterface。但是我想返回boost::shared_ptrofRet1以用于其他类,否则我必须在返回之后强制转换返回的值。 难道我做错了什么? 如果不是,为什么这样的语言-在这种情况下,应该可以扩展以处理智能指针之间的转换?有理想的解决方法吗?


11
如果您已经知道变量应该是常量,为什么还要使用关键字const?
const当不应该修改变量的值时,我正在阅读的许多书都使用关键字。除了向代码的读者指定如果您修改此变量可能会导致错误的代码(您可以使用注释来做到这一点),为什么还需要将该关键字作为任何编程语言的一部分?在我看来,如果您不想修改变量,那就根本不要。 有人可以帮我澄清一下吗?
70 c++  c  constants  keyword 

4
为什么在Herb Sutter的CppCon 2014演讲(返回基础知识:现代C ++风格)中不建议采用赋值设置器成员函数?
在Herb Sutter的CppCon 2014演讲“回到基础:现代C ++风格”中,他在幻灯片28(此处是幻灯片的网络副本)上提到了这种模式: class employee { std::string name_; public: void set_name(std::string name) noexcept { name_ = std::move(name); } }; 他说这是有问题的,因为当用临时调用set_name()时,noexcept-ness并不强(他使用短语“ noexcept-ish”)。 现在,我在自己最近的C ++代码中已经大量使用了上述模式,主要是因为它使我每次都不必键入两个set_name()副本-是的,我知道每次强制执行一个副本构造可能会有点效率低下,但嘿,我是一个懒惰的打字员。但是,Herb的短语“ this noexcept有问题”令我担心,因为我在这里没有遇到问题:std :: string的移动赋值运算符是noexcept,它的析构函数也是如此,因此对我来说,上面的set_name()似乎可以保证noexcept。我确实在编译器准备参数时在set_name()之前看到了潜在的异常抛出,但是我正在努力将其视为有问题的。 后来在幻灯片32上,赫伯清楚地指出以上内容是反模式。有人可以向我解释为什么我懒得写不好的代码吗?
70 c++  c++11  stl 

5
流是什么意思?有什么特点?
C ++和C#都使用这个词stream来命名许多类。 C ++:iostream,istream,ostream,stringstream,ostream_iterator,istream_iterator... C# :, Stream,,FileStream ...MemoryStreamBufferedStream 所以我很想知道,这stream是什么意思?一个的特点是stream什么?我什么时候可以用这个术语来命名我的班级?这仅限于文件I / O类吗? 有趣的是,据我所知,C在任何地方都不会使用该词。
70 c#  c++  class  stream  terminology 

5
应该永远不要使用静态内联函数吗?
使用inline关键字有两个含义(第7.1.3 / 4节): 它提示编译器,在调用点替换函数主体比通常的函数调用机制更可取。 即使省略了内联替换,也要遵循内联的其他规则(尤其是一个定义规则)。 通常,如果需要,任何主流的编译器都会在调用时替换函数体,因此inline,#1真正不需要仅将函数标记为。 更进一步 #2,据我了解,当您将一个函数声明为static inlinefunction时, 该static对功能力关键字inline函数有一个内部连接(内联函数具有外部连接)这样的功能中的每一个实例被视为一个单独的功能(各功能的地址是不同的)和这些功能中的每一种情况下都有自己的副本静态局部变量和字符串文字(内联函数只有这些的一个副本) 因此,这种功能就像其他任何功能一样 static功能,并且关键字inline不再具有重要性,因此变得多余。 因此,实际上标记功能static,inline两者都没有用。应该是static(不是最优选的)还是inline(最优选的), 那么,在一个函数上使用static和inline在一起实际上是没有用的吗?
70 c++  static  inline 

3
Arduino使用C还是C ++?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 从Python来的,整个C / C ++都是以异类开头的……然后我在一个地方看到Arduino使用“标准” C,在另一个地方看到它使用“标准” C ++,依此类推。向前。哪有 我对这两者之间的区别的粗略理解是,C ++(大致)是带有类/对象的C。我应该集中精力学习主要用于Arduino的语言或方言(C或C ++)如何受到影响?
70 c++  c  arduino 



4
BSTR到std :: string(std :: wstring),反之亦然
在C ++中使用COM时,字符串通常是BSTR数据类型。有人可以使用BSTR包装纸CComBSTR或MS的包装纸CString。但是因为我不能在MinGW编译器中使用ATL或MFC,是否有标准代码片段可以转换BSTR为std::string(或std::wstring),反之亦然? 是否还有一些非MS包装BSTR类似于CComBSTR? 更新资料 感谢所有以任何方式帮助我的人!仅仅因为没有人解决过BSTR和之间的转换问题std::string,所以我想在此提供一些实现方法的线索。 以下是我用来分别转换BSTR为std::string和的函数:std::stringBSTR std::string ConvertBSTRToMBS(BSTR bstr) { int wslen = ::SysStringLen(bstr); return ConvertWCSToMBS((wchar_t*)bstr, wslen); } std::string ConvertWCSToMBS(const wchar_t* pstr, long wslen) { int len = ::WideCharToMultiByte(CP_ACP, 0, pstr, wslen, NULL, 0, NULL, NULL); std::string dblstr(len, '\0'); len = ::WideCharToMultiByte(CP_ACP, 0 /* no flags */, pstr, wslen /* …
70 c++  string  com 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.