我有需要解析的XML文档和/或我需要构建XML文档并将它们写入文本(文件或内存).由于C++标准库没有此库,我应该使用什么?
注意:这是一个明确的,C++ - FAQ风格的问题.所以,是的,它与其他人重复.我不是简单地适应其他问题,因为他们倾向于要求更具体的东西.这个问题更通用.
每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.
C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?
为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:
ostringstream
http://ideone.com/2PPYwchar[]
缓冲区http://ideone.com/Ni5ctvector<char>
使用http://ideone.com/Mj2Fi将二进制数据放入其中back_inserter
vector<char>
简单的迭代器http://ideone.com/9iitvstringbuf
http://ideone.com/qc9QAvector<char>
简单的迭代器加边界检查http://ideone.com/YyrKy请注意,ostringstream
和stringbuf
版本运行的迭代次数较少,因为它们的速度要慢得多.
在ideone上,它ostringstream
比std: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 mschar[]
:3.7毫秒在我的笔记本电脑上(Visual C++ 2010 x86,cl …
我第一次使用地图,我意识到有很多方法可以插入元素.您可以使用emplace()
,operator[]
或者insert()
使用value_type
或使用或等变体make_pair
.虽然有很多关于所有这些信息以及有关特定案例的问题的信息,但我仍然无法理解大局.所以,我的两个问题是:
每个人比其他人的优势是什么?
是否需要在标准中添加安全性?没有它之前有什么是不可能的吗?
当我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;))
我假设"i"是增量而"a"是指定的,但我无法弄清楚或找到答案.此外,它看起来非常类似于itoa
我认为令人困惑的非标准.
我失去了三天的生命追踪一个非常奇怪的错误,其中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) const auto&
如果我想执行只读操作就足够了.但是,我已经碰到了
for (auto&& e : v) // v is non-const
Run Code Online (Sandbox Code Playgroud)
最近几次.这让我想知道:
是否有可能在一些不起眼的角落情况下,存在使用通用引用一些性能优势,相比auto&
还是const auto&
?
(shared_ptr
是一个晦涩角落案件的嫌疑人)
更新 我在收藏夹中找到的两个示例:
迭代基本类型时使用const引用的任何缺点?
我可以使用基于范围的for循环轻松迭代地图的值吗?
请专注于一个问题:我为什么要在使用自动&&范围为基础的for循环?
如何为具有unique_ptr
成员变量的类实现复制构造函数?我只考虑C++ 11.
正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
C++ 14提出std::dynarray
:
std :: dynarray是一个序列容器,它封装了一个在构造时固定的大小的数组,并且在整个对象的生命周期内不会改变.
std::dynarray
必须在运行时分配,如同std::vector
.
那么std::dynarray
我们可以使用std::vector
哪些更有活力(又重新调整大小)的好处和用途是什么?
c++ ×10
c++11 ×4
c++-faq ×2
performance ×2
as-if ×1
c ×1
clang ×1
dictionary ×1
emplace ×1
for-loop ×1
gcc ×1
insert ×1
iostream ×1
operators ×1
optimization ×1
standards ×1
stdvector ×1
unique-ptr ×1
xml-parsing ×1