Questions tagged «c++»

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

9
在C ++类中使用虚拟方法的性能成本是多少?
C ++类(或其任何父类)中至少有一个虚拟方法意味着该类将具有一个虚拟表,并且每个实例将具有一个虚拟指针。 因此,内存成本非常明显。最重要的是实例上的内存开销(特别是如果实例很小,例如,如果它们仅打算包含一个整数:在这种情况下,每个实例中都有一个虚拟指针可能会使实例的大小增加一倍。)虚拟表所用的内存空间,我想它与实际方法代码所用的空间相比通常可以忽略不计。 这让我想到了一个问题:将方法虚拟化是否有可衡量的性能成本(即速度影响)?在每次调用方法时,都会在运行时在虚拟表中进行查找,因此,如果对这个方法的调用非常频繁,并且如果此方法很短,那么性能可能会受到影响吗?我猜这取决于平台,但是有人在运行一些基准测试吗? 我问的原因是,我遇到了一个错误,该错误恰好是由于程序员忘记定义虚拟方法而引起的。这不是我第一次看到这种错误。我想:我们为什么要添加虚拟关键字,而不是需要时取出时,我们绝对相信这是它的虚拟关键字没有必要?如果性能成本很低,我想我会在团队中简单推荐以下内容:只需在每个类中默认使每个方法都是虚拟的,包括析构函数,并且仅在需要时才将其删除。这听起来对您来说疯狂吗?



10
“请检查gdb是否已进行代码签名-请参阅taskgated(8)”-如何安装带有自制代码签名的gdb?
我在osx 10.8.4下安装了带有自制软件的gdb 7.5.1(动机是使用新功能(如--with-python等)获得新的gdb) 长话短说,当我在c ++ Eclipse项目中运行调试时,我得到: Error in final launch sequence Failed to execute MI command: -exec-run Error message from debugger back end: Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8)) Unable to find Mach task port for …
107 c++  eclipse  macos  gdb  homebrew 


2
C ++ 20是否要求将源代码存储在文件中?
但是,一个有点奇怪的问题是,如果我没记错的话,C ++源代码不需要文件系统来存储其文件。 拥有一个可以通过相机扫描手写纸的编译器将是一个符合要求的实现。尽管实际上没有太大意义。 但是,C ++ 20现在使用添加了源位置file_name。现在,这是否意味着源代码应始终存储在文件中?

4
什么是透明比较器?
在C ++ 14中,关联容器似乎已从C ++ 11进行了更改– [associative.reqmts] / 13说: 成员函数模板find,count,lower_bound,upper_bound,并且equal_range不得,除非类型参与重载决议Compare::is_transparent存在。 使比较器“透明”的目的是什么? C ++ 14还提供了如下库模板: template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; }; template <> struct less<void> { template <class T, class U> …
106 c++  c++14  c++-faq 

9
在哪里可以获得“有用的” C ++二进制搜索算法?
我需要一个与C ++ STL容器兼容的二进制搜索算法,就像std::binary_search在标准库的<algorithm>标头中一样,但是我需要它返回指向结果的迭代器,而不是简单的布尔值告诉我元素是否存在。 (附带说明,标准委员会在为binary_search定义API时到底在想什么?!) 我主要关心的是我需要二进制搜索的速度,因此,尽管可以使用其他算法查找数据,如下所述,但我想利用这样一个事实,即我的数据经过排序以获得二进制的好处搜索,而不是线性搜索。 到目前为止lower_bound,upper_bound如果缺少基准点则失败: //lousy pseudo code vector(1,2,3,4,6,7,8,9,0) //notice no 5 iter = lower_bound_or_upper_bound(start,end,5) iter != 5 && iter !=end //not returning end as usual, instead it'll return 4 or 6 注意:只要与容器兼容,我也可以使用不属于std名称空间的算法。就像说boost::binary_search。

10
为什么包含Windows.h时std :: min失败?
#include <algorithm> #include <Windows.h> int main() { int k = std::min(3, 4); return 0; } 如果我包含Windows.h,则Windows在做什么?我不能std::min在Visual Studio 2005中使用。错误消息是: error C2589: '(' : illegal token on right side of '::' error C2059: syntax error : '::'

6
从C ++中的模板类继承
假设我们有一个模板类Area,它具有一个成员变量T area,一个T getArea()和一个void setArea(T)成员函数。 我可以Area通过键入创建特定类型的对象Area<int>。 现在,我有一个Rectangle继承Area该类的类。由于Rectangle本身不是模板,因此无法键入Rectangle<int>。 如何专门化对象的继承Area类型Rectangle? 编辑:对不起,我忘了澄清-我的问题是,是否有可能不专门化就继承Area,因此它不是作为int的Area继承的,而是因为Area Rectangle可以将其专门化的类型。

7
为什么“纯多态”优于使用RTTI?
我所见过的几乎所有讨论这种事情的C ++资源都告诉我,与使用RTTI(运行时类型标识)相比,我应该更喜欢多态方法。总的来说,我会认真对待这种建议,并会尝试并理解其基本原理-毕竟,C ++是一头强大的野兽,很难全面理解。但是,对于这个特定的问题,我正在空白,想看看互联网可以提供什么样的建议。首先,让我总结一下到目前为止我所学到的东西,列出引起RTTI被“认为有害”的常见原因: 一些编译器不使用它/ RTTI并非始终启用 我真的不赞成这种说法。这就像说我不应该使用C ++ 14功能,因为那里有不支持它的编译器。但是,没有人会阻止我使用C ++ 14功能。大多数项目将对他们正在使用的编译器及其配置方式产生影响。甚至引用了gcc手册页: -fno-rtti 使用C ++运行时类型标识功能(dynamic_cast和typeid)禁止使用虚拟函数生成有关每个类的信息。如果您不使用语言的这些部分,则可以使用此标志节省一些空间。请注意,异常处理使用相同的信息,但是G ++会根据需要生成它。dynamic_cast运算符仍可用于不需要运行时类型信息的强制转换,即强制转换为“ void *”或明确的基类。 这说明如果我不使用RTTI,可以将其禁用。这就像在说,如果您不使用Boost,则不必链接到它。我不需要为有人正在编译的情况做任何计划-fno-rtti。另外,在这种情况下,编译器将大声失败。 花费额外的内存/可能很慢 每当我想使用RTTI时,这意味着我需要访问类的某种类型信息或特征。如果我实现了不使用RTTI的解决方案,这通常意味着我将不得不在类中添加一些字段来存储此信息,因此memory参数实在是无效的(我会在下面进一步举例说明)。 实际上,dynamic_cast可能很慢。不过,通常有避免使用速度要求严格的情况的方法。而且我还没有看到替代方案。这样的SO答案建议使用基类中定义的枚举来存储类型。这只有在您知道所有派生类都是先验的情况下才有效。相当大的“如果”! 从这个答案来看,RTTI的成本似乎也不清楚。不同的人测量不同的东西。 优雅的多态设计将使RTTI不再必要 这是我认真对待的建议。在这种情况下,我简直无法提出涵盖我的RTTI用例的良好的非RTTI解决方案。让我举一个例子: 假设我正在编写一个库来处理某种对象的图形。我想允许用户在使用我的库时生成自己的类型(因此enum方法不可用)。我的节点有一个基类: class node_base { public: node_base(); virtual ~node_base(); std::vector< std::shared_ptr<node_base> > get_adjacent_nodes(); }; 现在,我的节点可以是不同的类型。这些怎么样: class red_node : virtual public node_base { public: red_node(); virtual ~red_node(); void get_redness(); …
106 c++  polymorphism  rtti 


3
std :: shared_ptr线程安全说明
我正在阅读http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html,但是对于我来说,一些线程安全性问题仍然不清楚: 标准保证引用计数是线程安全处理的,并且与平台无关,对吗? 相似的问题-标准保证只有一个线程(持有最后一个引用)会在共享库上调用delete,对吗? shared_ptr不能保证存储在其中的对象有任何线程安全吗? 编辑: 伪代码: // Thread I shared_ptr<A> a (new A (1)); // Thread II shared_ptr<A> b (a); // Thread III shared_ptr<A> c (a); // Thread IV shared_ptr<A> d (a); d.reset (new A (10)); 在线程IV中调用reset()会删除在第一个线程中创建的A类的先前实例,并将其替换为新实例吗?此外,在IV线程中调用reset()之后,其他线程将仅看到新创建的对象吗?
106 c++  c++11  shared-ptr 

5
哪一个最好的Linux C / C ++调试器(或gdb的前端)可以帮助教授编程?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我向新手讲了一种“精简” C ++编程课程(“精简”表示没有指针,没有类,只是普通的旧C语言以及引用,STL字符串和向量)。学生以前没有编程经验,因此我相信使用交互式调试器可以帮助他们理解程序流程,变量和递归。 本课程以Linux授课。教他们使用gdb实在是过大(他们不会使用也不了解大多数功能)。我只需要简单但易于使用的内容:查看程序现在位于哪一行,堆栈中有什么(局部变量,以前的调用等)。我看起来与旧的Turbo Pascal或Turbo C ++ Borland的调试器或Visual Studio调试器类似。 谢谢,
106 c++  linux  debugging 


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.