小编Nic*_*las的帖子

我应该在C++中使用什么XML解析器?

我有需要解析的XML文档和/或我需要构建XML文档并将它们写入文本(文件或内存).由于C++标准库没有此库,我应该使用什么?

注意:这是一个明确的,C++ - FAQ风格的问题.所以,是的,它与其他人重复.我不是简单地适应其他问题,因为他们倾向于要求更具体的东西.这个问题更通用.

c++ c++-faq xml-parsing

331
推荐指数
2
解决办法
16万
查看次数

C++标准是否要求iostream的性能不佳,或者我只是处理糟糕的实现?

每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.

C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?

基准

为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:

请注意,ostringstreamstringbuf版本运行的迭代次数较少,因为它们的速度要慢得多.

在ideone上,它ostringstreamstd:copy+ back_inserter+ 慢大约3倍std::vector,比memcpy原始缓冲区慢大约15倍.当我将实际应用程序切换到自定义缓冲时,这与前后分析一致.

这些都是内存缓冲区,因此iostream的缓慢不能归咎于缓慢的磁盘I/O,过多的刷新,与stdio的同步,或者人们用来解释C++标准库观察到的缓慢的任何其他事情iostream的.

很高兴看到其他系统上的基准测试和常见实现的评论(例如gcc的libc ++,Visual C++,Intel C++)以及标准规定了多少开销.

此测试的基本原理

许多人都正确地指出,iostream更常用于格式化输出.但是,它们也是C++标准提供的二进制文件访问的唯一现代API.但是对内部缓冲进行性能测试的真正原因适用于典型的格式化I/O:如果iostreams无法保持磁盘控制器提供原始数据,那么当他们负责格式化时,他们怎么可能跟上呢?

基准时间

所有这些都是outer(k)循环的每次迭代.

在ideone上(gcc-4.3.4,未知的操作系统和硬件):

  • ostringstream:53毫秒
  • stringbuf:27毫秒
  • vector<char>并且back_inserter:17.6毫秒
  • vector<char> 与普通迭代器:10.6毫秒
  • vector<char> 迭代器和边界检查:11.4 ms
  • char[]:3.7毫秒

在我的笔记本电脑上(Visual C++ 2010 x86,cl …

c++ performance iostream

193
推荐指数
3
解决办法
2万
查看次数

在c ++ map中插入vs emplace vs operator []

我第一次使用地图,我意识到有很多方法可以插入元素.您可以使用emplace(),operator[]或者insert()使用value_type或使用或等变体make_pair.虽然有很多关于所有这些信息以及有关特定案例的问题的信息,但我仍然无法理解大局.所以,我的两个问题是:

  1. 每个人比其他人的优势是什么?

  2. 是否需要在标准中添加安全性?没有它之前有什么是不可能的吗?

c++ dictionary insert operators emplace

167
推荐指数
4
解决办法
7万
查看次数

现代C++变得更加普遍吗?

当我6-7年前第一次学习C++时,我学到的基本上是"C with Classes".std::vector绝对是一个高级话题,如果你真的想要,你可以学到一些东西.当然没有人告诉我可以利用析构函数来帮助管理记忆.今天,我看到的每个地方都看到RAII和SFINAE,STL和Boost以及现代C++.即使是刚刚开始使用该语言的人,也几乎从第1天开始就教授这些概念.

我的问题是,这只是因为我只看到"最好的",即SO上的问题,以及其他倾向于吸引初学者(gamedev.net)的编程网站,或者这实际上代表了C++社区作为一个整体?

现代C++真的成为默认的吗?专家们写的不是一些奇特的东西,而是变成"C++的方式"吗?或者我只是无法看到仍然学习"C with classes"并编写自己的动态数组而不是使用的数千人std::vector,并通过从他们的顶级代码手动调用new/delete来进行内存管理?

尽管我想要相信它,但如果整个C++社区在几年内发展得如此之多,那似乎令人难以置信.您的经历和印象是什么?

(免责声明:不熟悉C++的人可能会错误地解释标题,因为询问C++是否比其他语言更受欢迎.这不是我的问题."现代C++"是C++中方言或编程风格的通用名称,以该书命名" 现代C++设计:通用编程和设计模式应用 ",我只对这与"旧C++"感兴趣.所以不需要告诉我C++的时间已经过去,我们都应该使用Python;))

c++

132
推荐指数
10
解决办法
3万
查看次数

什么是std :: iota代表什么?

我假设"i"是增量而"a"是指定的,但我无法弄清楚或找到答案.此外,它看起来非常类似于itoa我认为令人困惑的非标准.

c++ naming-conventions c++11

127
推荐指数
3
解决办法
3万
查看次数

C++标准委员会是否打算在C++ 11中unordered_map破坏它所插入的内容?

我失去了三天的生命追踪一个非常奇怪的错误,其中unordered_map :: insert()会破坏你插入的变量.这种非常明显的行为只发生在最近的编译器中:我发现clang 3.2-3.4和GCC 4.8是唯一能够证明这个"特性"的编译器.

这是我的主代码库中的一些简化代码,用于演示此问题:

#include <memory>
#include <unordered_map>
#include <iostream>

int main(void)
{
  std::unordered_map<int, std::shared_ptr<int>> map;
  auto a(std::make_pair(5, std::make_shared<int>(5)));
  std::cout << "a.second is " << a.second.get() << std::endl;
  map.insert(a); // Note we are NOT doing insert(std::move(a))
  std::cout << "a.second is now " << a.second.get() << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我和大多数C++程序员一样,希望输出看起来像这样:

a.second is 0x8c14048
a.second is now 0x8c14048
Run Code Online (Sandbox Code Playgroud)

但是对于clang 3.2-3.4和GCC 4.8,我得到了这个:

a.second is 0xe03088
a.second is now 0
Run Code Online (Sandbox Code Playgroud)

这可能毫无意义,直到您仔细检查http://www.cplusplus.com/reference/unordered_map/unordered_map/insert/中unordered_map :: insert()的文档,其中重载号为2:

template <class P> pair<iterator,bool> …
Run Code Online (Sandbox Code Playgroud)

c++ standards gcc clang c++11

113
推荐指数
2
解决办法
6285
查看次数

在基于范围的for循环中使用通用引用有什么好处?

const auto&如果我想执行只读操作就足够了.但是,我已经碰到了

for (auto&& e : v)  // v is non-const
Run Code Online (Sandbox Code Playgroud)

最近几次.这让我想知道:

是否有可能在一些不起眼的角落情况下,存在使用通用引用一些性能优势,相比auto&还是const auto&

(shared_ptr是一个晦涩角落案件的嫌疑人)


更新 我在收藏夹中找到的两个示例:

迭代基本类型时使用const引用的任何缺点?
我可以使用基于范围的for循环轻松迭代地图的值吗?

请专注于一个问题:我为什么要在使用自动&&范围为基础的for循环?

c++ performance for-loop move-semantics c++11

111
推荐指数
3
解决办法
2万
查看次数

使用unique_ptr复制类的构造函数

如何为具有unique_ptr成员变量的类实现复制构造函数?我只考虑C++ 11.

c++ unique-ptr c++11

89
推荐指数
5
解决办法
7万
查看次数

究竟什么是"假设"规则?

正如标题所说,

究竟什么是"假设"规则?

一个典型的答案是:

允许任何和所有代码转换不会改变程序的可观察行为的规则

我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.

注意:将其标记为C和C++,因为它与两种语言都相关.

c c++ optimization c++-faq as-if

83
推荐指数
2
解决办法
7359
查看次数

std :: dynarray vs std :: vector

C++ 14提出std::dynarray:

std :: dynarray是一个序列容器,它封装了一个在构造时固定的大小的数组,并且在整个对象的生命周期内不会改变.

std::dynarray必须在运行时分配,如同std::vector.

那么std::dynarray我们可以使用std::vector哪些更有活力(又重新调整大小)的好处和用途是什么?

c++ stdvector

81
推荐指数
2
解决办法
2万
查看次数