Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

1
raw,weak_ptr,unique_ptr,shared_ptr等…如何明智地选择它们?
C ++中有很多指针,但是老实说,在5年左右的C ++编程中(特别是Qt Framework),我仅使用旧的原始指针: SomeKindOfObject *someKindOfObject = new SomeKindOfObject(); 我知道还有很多其他“智能”指针: // shared pointer: shared_ptr<SomeKindofObject> Object; // unique pointer: unique_ptr<SomeKindofObject> Object; // weak pointer: weak_ptr<SomeKindofObject> Object; 但是我对如何处理它们以及在原始指针比较中它们可以为我提供什么一无所知。 例如,我有这个类头: #ifndef LIBRARY #define LIBRARY class LIBRARY { public: // Permanent list that will be updated from time to time where // each items …

7
为什么不继承构造函数?
我对如果构造函数是从基类继承而可能出现的问题感到困惑。Cpp Primer Plus说, 构造函数与其他类方法的不同之处在于它们创建新对象,而其他方法则由现有对象调用。这是构造函数不被继承的原因之一。继承意味着派生的对象可以使用基类方法,但是对于构造函数,该对象直到构造函数完成工作后才存在。 我了解在对象构造完成之前调用了构造函数。 如果子类继承(父类是指子类能够覆盖父类方法等,而不仅仅是访问父类方法),则父构造函数会导致问题吗? 我知道没有必要从代码中显式调用构造函数(尚不知道。),而在创建对象时除外。即使这样,您也可以使用某种机制来调用父构造器(在cpp中,使用::或使用member initialiser list,在java中使用super)。在Java中,在第一行有一个强制调用它,我知道这是要确保首先创建父对象,然后再进行子对象构造。 它可能会覆盖它。但是,我无法提出可能造成问题的情况。如果孩子确实继承了父构造函数,那会出错吗? 这样只是为了避免继承不必要的功能。还是还有更多呢?
33 c++  inheritance 

9
可能写太多的断言吗?
我非常喜欢assert用C ++代码编写检查,以此来捕获开发过程中由于程序中的逻辑错误而无法发生但确实会发生的情况。通常,这是一个好习惯。 但是,我注意到,我编写的某些函数(属于复杂类的一部分)具有5个以上的断言,就可读性和可维护性而言,这似乎可能是一种不良的编程习惯。我认为它仍然很棒,因为每个人都需要我考虑函数的前置条件和后置条件,它们确实有助于捕获错误。但是,我只是想把它放在那儿,以问在需要进行大量检查的情况下,是否存在更好的范例来捕获逻辑错误。 Emacs注释:由于Emacs是我的首选IDE,因此我将它的assert语句略显灰色,这有助于减少它们可以提供的混乱感。这是我添加到.emacs文件中的内容: ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))

4
适用于C,C ++等的JIT编译器
是否有针对C和C ++等已编译语言的即时编译器?(想到的第一个名字是Clang和LLVM!但是我不认为它们目前支持它。) 说明: 我认为该软件可以受益于运行时性能分析反馈以及在运行时对热点进行积极优化的重新编译,即使对于C和C ++等编译为机器的语言也是如此。 概要文件引导的优化可以完成类似的工作,但是不同的是,JIT在不同的环境中会更加灵活。在PGO中,您在运行二进制文件之前先运行它。发行后,它将不会在运行时收集任何环境/输入反馈。因此,如果更改输入模式,则可能会降低性能。但是,即使在这种情况下,JIT也能很好地工作。 但是,我认为JIT编译性能的好处是否超过其自身的开销是有争议的。

7
用C语言编写性能?[关闭]
我知道我经常听到C通常比C ++具有性能优势。在我意识到MSVC似乎甚至不支持C的最新标准之前,我并没有真正想到它,但据我所知,最新的版本支持C99。 我打算编写一个包含一些代码的库以在OpenGL中呈现,以便我可以重用它。我打算用C语言编写该库,因为在图形方面,任何性能的提高都是值得欢迎的。 但这真的值得吗?使用该库的代码很可能是用C ++编写的,而我通常更喜欢用C ++编写代码。 但是,如果产生的性能差异很小,我可能会选择C。 可能还需要注意的是,这个库将是我可以在Windows / OS X / Linux上使用的库,并且我很可能会原生编译所有内容(Windows的MSVC,OS X的Clang或GCC以及Linux的GCC。 。或可能是英特尔的所有编译器)。 我环顾四周,并找到了一些基准测试等,但是我所看到的所有内容都是针对GCC而不是MSVC和Clang的。此外,基准测试未提及所用语言的标准。有人对此有任何想法吗? 编辑:经过几年的经验,我只是想分享我对这个问题的观点。我最终用C ++编写了一个问这个问题的项目。我大约在同一时间在C中启动了另一个项目,因为我们希望获得尽可能少的性能,并且需要该项目在C中可链接。几个月前,我到达了真正需要地图和高级界面的地步字符串操作。我知道C ++标准库中的这种功能,并最终得出结论:标准库中的那些结构可能会比在合理的时间内可以在C中实现的映射和字符串更好并且更稳定。通过向C ++代码编写C接口,可以很容易地满足在C中可链接的要求,该接口可以通过不透明类型快速完成。用C ++重写库似乎比用C编写库快得多,而且不容易出现错误,尤其是内存泄漏。我还能够使用标准库线程库,该库比使用特定于平台的实现要容易得多。最后,我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。


10
在C ++中对向量使用列表的意义是什么?
我已经运行了3个涉及C ++列表和向量的不同实验。 事实证明,即使在中间涉及很多插入操作,带有向量的操作也更加有效。 因此,出现了一个问题:在哪种情况下列表比矢量有意义? 如果向量在大多数情况下似乎更有效率,并考虑其成员的相似程度,那么列表还有哪些优势? 生成N个整数并将其放入容器中,以便容器保持排序状态。通过逐个读取元素并在第一个较大的元素之前插入新的元素,已天真地执行了插入操作。 与向量相比,有了清单,尺寸增加时,时间就会流逝。 在容器的末尾插入N个整数。 对于列表和向量,时间增加了相同的数量级,尽管向量快3倍。 在容器中插入N个整数。 启动计时器。 使用list.sort来排序容器,使用std :: sort来对容器进行排序。停止计时器。 同样,时间以相同的数量级增加,但使用向量平均要快5倍。 我可能会继续进行测试,并找出几个清单可以证明更好的例子。 但是你们阅读此消息的共同经验可能会提供更有成效的答案。 您可能遇到过这样的情况,其中列表更易于使用或执行得更好?

8
正在通过Qt框架真正学习C ++来学习C ++ [关闭]
我的问题是,我阅读的大多数C ++书籍都几乎永远花在语法和语言基础上,例如for循环while,数组,列表,指针等。 但是他们似乎从来没有建立过足够简单的东西用于学习,却又足够实际的东西来使您理解语言的哲学和力量。 然后我偶然发现了QT,这是一个了不起的库! 但是通过他们的演示进行工作,似乎我现在正处于相反的困境。我感觉像是有钱人的儿子在父亲补贴的跑车中开着车。就像我可以构建出色的软件一样,却不知道幕后到底发生了什么。 作为我的两难选择的一个例子,是构建一个简单的Web浏览器。在纯C ++中,我什至不知道从哪里开始,但是使用Qt库,可以在几行代码中完成。 我没有为此抱怨。我只是想知道如何填补语言的基本结构和Qt框架提供的高级接口之间的知识空白?

11
typedefs和#defines
我们每个人肯定都使用了typedefs和#defines。今天,在与他们一起工作时,我开始思考一件事。 请考虑以下两种情况,以使用int其他名称的数据类型: typedef int MYINTEGER 和 #define MYINTEGER int 与上述情况类似,在很多情况下,我们可以使用#define很好地完成某件事,并且也可以使用typedef进行相同的操作,尽管我们进行相同操作的方式可能完全不同。#define还可以执行typedef不能执行的MACRO操作。 尽管使用它们的基本原因是不同的,但是它们的工作有何不同?当两者都可以使用时,什么时候应该优先使用另一种呢?另外,在某些情况下,是否可以保证一个比另一个更快?(例如,#define是预处理程序指令,因此所有操作都比编译或运行时更早完成)。

5
允许内部向量的迭代而不会泄漏实现
我有一堂课代表一个人的名单。 class AddressBook { public: AddressBook(); private: std::vector<People> people; } 我想允许客户遍历人脉。我首先想到的只是: std::vector<People> & getPeople { return people; } 但是,我不想将实现细节泄漏给客户端。修改向量时,我可能想保留某些不变式,而当我泄漏实现时,我将失去对这些不变式的控制。 允许迭代而不泄漏内部的最佳方法是什么?
32 c++ 

8
对变量使用较小的数据类型以节省内存是一种好习惯吗?
当我第一次学习C ++语言时,我了解到除了int,float等之外,这些数据类型还存在着较小或较大的版本。例如我可以称一个变量x int x; or short int x; 主要区别在于short int占用2个字节的内存,而int占用4个字节,而short int的值较小,但是我们也可以调用它来使其更小: int x; short int x; unsigned short int x; 更加严格。 我的问题是,根据变量在程序中采用的值,使用单独的数据类型是否是一个好习惯。始终根据这些数据类型声明变量是一个好主意吗?

3
错误处理注意事项
问题: 长期以来,我对这种exceptions机制感到担心,因为我觉得它并不能真正解决应有的问题。 要求:关于该主题的争论很长时间,而且大多数人都在努力比较exceptions和返回错误代码。这绝对不是这里的主题。 尝试定义错误,我同意Bjarne Stroustrup和Herb Sutter的CppCoreGuidelines 错误表示该功能无法实现其广告目的 要求:该exception机制是用于处理错误的语言语义。 要求:对我来说,没有“没有借口”的功能不能完成任务:要么我们错误地定义了前后条件,所以该功能无法确保结果,或者某些特殊情况对于花时间在开发上没有足够重要的意义。一个办法。考虑到IMO,常规代码和错误代码处理之间的区别(在实施之前)是非常主观的。 要求:使用异常指示何时不保留前置条件或后置条件是该exception机制的另一个目的,主要是用于调试目的。我的目标不是这里的用法exceptions。 在许多书籍,教程和其他资料中,它们倾向于将错误处理显示为一门相当客观的科学,可以解决这一问题,exceptions而您只需要catch它们具有强大的软件就可以从任何情况下恢复。但是,作为开发人员的几年时间使我从另一种方法来看问题: 程序员倾向于通过抛出异常来简化他们的任务,而这种特殊情况似乎太少而无法仔细实现。典型的情况是:内存不足问题,磁盘已满问题,文件损坏等,这可能就足够了,但并不总是从体系结构级别决定。 程序员往往不会仔细阅读有关库中异常的文档,并且通常不知道函数何时何地抛出。而且,即使他们知道了,他们也并没有真正管理它们。 程序员往往没有足够早地捕获异常,当他们捕获异常时,主要是记录并抛出更多异常。(请参阅第一点)。 这有两个结果: 经常发生的错误可以在开发的早期发现并进行调试(很好)。 罕见的异常无法管理,并且会使系统在用户家崩溃(带有一条漂亮的日志消息)。有时会报告错误,甚至不会报告。 考虑到这一点,海事组织错误机制的主要目的应该是: 在不管理某些特定情况的代码中使可见。 发生这种情况时,将问题运行时与相关代码(至少是调用方)进行通信。 提供恢复机制 exception语义作为错误处理机制的主要缺陷是IMO:很容易看到a throw在源代码中的位置,但是绝对不明显,通过查看声明来知道特定功能是否会抛出。这带来了我上面介绍的所有问题。 该语言不会像对语言的其他方面(例如强类型的变量)那样严格执行和检查错误代码 尝试解决方案 为了改善这一点,我开发了一个非常简单的错误处理系统,该系统试图使错误处理的重要性与普通代码相同。 这个想法是: 每个(相关)功能都接收到对success非常轻的对象的引用,并可能将其设置为错误状态。在保存文本错误之前,该对象非常轻。 如果提供的对象已经包含错误,则鼓励函数跳过其任务。 绝对不能覆盖错误。 完整的设计显然会全面考虑每个方面(约10页),以及如何将其应用于OOP。 Success该类的示例: class Success { public: enum SuccessStatus { ok = 0, // All is fine error = 1, // …


8
直接使用Make做过时了吗?[关闭]
因此,我遇到了很多有关直接创建makefile的评论/帖子/等等,以及在2015年如何做是一件愚蠢的事情。我知道诸如CMake之类的工具,实际上我经常使用CMake。事实是,CMake只是为您创建Makefile,并帮助消除了您自己做的乏味。当然,它还添加了许多其他强大的功能……但是最后它仍然是一个Makefile。 所以我的问题是,关于make的“过时”讨论是指整个Make实用程序,还是仅仅是手动编写自己的Makefile的想法?我根本不使用IDE进行C / C ++开发(只是emacs),所以我总是写Makefile。 如果Make被认为已经过时,那么C / C ++开发人员应该使用什么来构建小型个人项目?
31 c++  c  builds  make  cmake 

2
什么是C ++ / CX和C ++ / CLI,它们与C ++和WinRT有何关系?
我当时正在考虑接受学习C ++来设计Metro应用程序的挑战,那是我遇到C ++ / CX的时候。 Metro应用程序可以用C ++ 11编码吗?他们需要C ++ / CX才能工作吗?C ++ / CX到底是什么?是否可以仅使用C ++创建Metro应用,还是需要C ++ / CX?另外,C ++ / CLI如何与这张图片联系起来?
31 c++  windows-8  winrt 

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.