Questions tagged «c++»

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


4
使用boost :: shared_ptr进行static_cast?
static_cast与with等效boost::shared_ptr吗? 换句话说,我该如何重写以下内容 Base* b = new Derived(); Derived* d = static_cast<Derived*>(b); 什么时候使用shared_ptr? boost::shared_ptr<Base> b(new Derived()); boost::shared_ptr<Derived> d = ???


2
从构造函数抛出后调用析构函数
我曾经认为在C ++中,如果构造函数引发异常,则不会调用此“部分构造”类的析构函数。 但是似乎在C ++ 11中不再是这样:我使用g ++编译了以下代码,并将其打印X destructor到控制台。为什么是这样? #include <exception> #include <iostream> #include <stdexcept> using namespace std; class X { public: X() : X(10) { throw runtime_error("Exception thrown in X::X()"); } X(int a) { cout << "X::X(" << a << ")" << endl; } ~X() { cout << "X destructor" << …
73 c++  exception  c++11 

20
测试数字是否为斐波那契
我知道如何制作斐波那契数字列表,但我不知道如何测试给定数字是否属于斐波那契列表-一种想到的方法是生成fib列表。直到该数字为止,并查看它是否属于数组,但是必须有另一个更简单,更快速的方法。 有任何想法吗 ?

5
在C ++中使用双重包含保护
因此,我最近在我的工作地点进行了讨论,其中我质疑使用双重包含保护而不是单个保护。我所说的双重保护如下: 头文件“ header_a.hpp”: #ifndef __HEADER_A_HPP__ #define __HEADER_A_HPP__ ... ... #endif 在头文件或源文件中的任何位置包含头文件时: #ifndef __HEADER_A_HPP__ #include "header_a.hpp" #endif 现在,我知道在头文件中使用防护是为了防止多次包含已经定义的头文件,这是常见且有据可查的。如果已经定义了宏,则编译器会将整个头文件视为“空白”,并防止重复包含。很简单。 我不理解的问题是使用#ifndef __HEADER_A_HPP__和#endif周围#include "header_a.hpp"。我的同事告诉我,这为夹杂物增加了第二层保护,但是我看不到如果第一层确实完成了工作(或做到了吗?),那么第二层是多么有用。 我能想到的唯一好处是,它彻底阻止了链接程序费心查找文件。这是否是为了缩短编译时间(这没有被提及是有好处的),还是还有其他我看不到的东西在起作用?
73 c++  macros  linker 

3
尽管右侧有异常,但仍发生C ++中的赋值
我有一些(C ++ 14)代码看起来像这样: map<int, set<string>> junk; for (int id : GenerateIds()) { try { set<string> stuff = GetStuff(); junk[id] = stuff; } catch (const StuffException& e) { ... } } 这有效。有时会GetStuff()抛出一个异常,这很好用,因为如果可以,那么我就不需要垃圾地图中的值。 但是起初我是在循环中编写此代码的,这是行不通的: junk[id] = GetStuff(); 更准确地说,即使GetStuff()抛出异常,junk[id]也会被创建(并分配一个空集)。 这不是我期望的:我希望它们以相同的方式起作用。 这里有我误解的C ++原理吗?
73 c++  c++14 


18
圆形无锁缓冲器
我正在设计一个系统,该系统连接到一个或多个数据提要流,并根据触发结果对数据进行一些分析。在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列中,并且有多个消费者线程读取数据,并且消费者只对最新数据点加n个点感兴趣。如果慢速使用者无法跟上生产者线程,则生产者线程将不得不阻塞,当然,当没有未处理的更新时,使用者线程也会阻塞。使用具有读取器/写入器锁定的典型并发队列会很好地工作,但是数据输入的速率可能很大,因此我想减少我的锁定开销,特别是为生产者减少写入器锁定。我认为我需要一个循环无锁缓冲区。 现在有两个问题: 循环无锁缓冲区是否是答案? 如果是这样,在我提出自己的建议之前,您知道任何适合我需要的公共实施方式吗? 始终欢迎实现循环无锁缓冲区的任何指针。 顺便说一句,在Linux上的C ++中执行此操作。 一些其他信息: 响应时间对我的系统至关重要。理想情况下,使用者线程希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统一文不值,甚至少很多。 我倾向于的设计思想是一个无半锁的循环缓冲区,在此缓冲区中,生产者线程将数据尽可能快地放入缓冲区中,我们将其称为缓冲区A的头,除非缓冲区已满,否则不要阻塞A与缓冲区Z的末尾相遇。使用者线程将分别持有两个指向循环缓冲区的指针P和P n,其中P是线程的本地缓冲区头,而P n是P之后的第n个项目。每个使用者线程都将推进其P一旦完成当前P的处理,P n和P n就会以最慢的P n前进到缓冲区指针Z的末尾。当P赶上A,这意味着不再有新的更新要处理时,使用者旋转并忙于等待A再次前进。如果使用者线程旋转时间过长,则可以使其进入睡眠状态并等待条件变量,但是我可以接受使用者占用CPU周期等待更新,因为这不会增加我的延迟(我将拥有更多的CPU内核)比线程)。想象一下,您有一个循环的轨道,而生产者在一群消费者的面前运行,关键是调整系统,以便生产者通常比消费者领先几步,而其中大多数操作可以使用无锁技术完成。我知道正确实现实现的细节并不容易...好吧,非常艰苦,这就是为什么我想在别人做些自己的事情之前先从别人的错误中学习。


3
C ++:返回值是L值吗?
考虑以下代码: struct foo { int a; }; foo q() { foo f; f.a =4; return f;} int main() { foo i; i.a = 5; q() = i; } 没有编译器抱怨它,即使是Clang。为什么q() = ...行是正确的?

7
动态投射到空指针是否有实际用途?
在C ++中,该T q = dynamic_cast<T>(p);构造对指向p某些其他指针类型的指针执行运行时转换,这些指针T必须出现在动态类型的继承层次结构*p中才能成功。一切都很好。 但是,也可以执行dynamic_cast<void*>(p),它将仅返回指向“最派生对象”的指针(请参见C ++ 11中的5.2.7 :: 7)。我知道此功能可能在动态演员表的实施中免费提供,但实际上有用吗?毕竟,它的返回类型充其量void*是什么,那么这有什么用呢?
73 c++  dynamic-cast 

6
无需汇编的C / C ++函数定义
我一直认为printf(),在最后一步中,要使用内联汇编来定义类似的函数。stdio.h的深处埋有一些asm代码,该代码实际上告诉CPU该怎么做。例如,在dos中,我记得它是通过首先mov将字符串的开头放置到某个内存位置或寄存器中,而不是调用int中断来实现的。 但是,由于Visual Studio的x64版本根本不支持嵌入式汇编程序,这使我想知道在C / C ++中根本没有汇编程序定义的函数。printf()在不使用汇编代码的情况下,如何在C / C ++中实现类似库的功能?究竟是什么执行正确的软件中断?谢谢。

7
c ++:用逗号格式化数字?
我想编写一个方法,该方法将接受一个整数并返回std::string以逗号格式化的该整数的。 声明示例: std::string FormatWithCommas(long value); 用法示例: std::string result = FormatWithCommas(7800); std::string result2 = FormatWithCommas(5100100); std::string result3 = FormatWithCommas(201234567890); // result = "7,800" // result2 = "5,100,100" // result3 = "201,234,567,890" string用逗号将数字格式化为a的C ++方法是什么? (奖金也将处理double。)

5
C ++中的内部类是否自动成为朋友?
如果我在C ++中定义一个内部类,它是否自动成为包含它的类的朋友?例如,这合法吗: class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? } 我问,因为在某些我尝试过的编译器(VS2003)上,此代码无法正常工作,但我至少听说过它在某些编译器上确实有效。我无法在C ++规范中找到与此相关的部分,并且如果有人可以引用某些特定的东西,那就说这是合法的或不合法的,那将是很好的。

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.