2009-04-29 79 views

回答

3

对于99%的时间和标准库实现的99%,你会发现,性病::向量将是速度不够快,你使用他们获得的便利性和安全性将超过超过任何小的性能代价。

对于那些当你真的需要裸机代码非常罕见的情况下,你可以像对待一个C数组的载体:

vector <int> v(100); 
int * p = &v[0]; 
p[3] = 42; 

C++标准保证矢量连续地分配,所以这是保证工作。

关于字符串,便利因素变得越来越重要,性能问题趋于消失。如果你使用C风格的字符串,你也会回到像strlen()这样的函数的使用,这些函数本身就是非常不合适的。

至于列表,在使用它们之前,无论是自己的实现还是标准,对于列表,您都应该三思而后行,可能三次。使用矢量/阵列可以更好地解决绝大多数计算问题。理由列表在文献中经常出现的原因很大程度上是因为它们是教科书和培训课程编写者用来解释指针和动态分配的便利数据结构。我作为一名前训练课程作家在这里讲话。

+0

我不明白在尝试排序时如何使用向量可以工作,当然这些列表对于这些事情来说列表效率更高?或者,如果在排序时使用多个向量而不是单个列表,它会更好吗? – tweetypi 2009-04-29 10:13:20

0

如果你不需要实时响应,坚持你的方法。他们比chars更安全。

2

一个问题是访问元素时的开销。即使在通过索引访问元素时使用向量和字符串,您也需要先检索缓冲区地址,然后添加偏移量(不要手动执行,但编译器会发出此类代码)。对于原始数组,您已经拥有缓冲区地址。这种额外的间接性会在某些情况下导致大量开销,并且在想要提高性能时可能需要进行分析。

+0

这里的技巧不是使用`operator []`,而是使用迭代器。他们经常将char *映射到底层字符数组中。 – 2009-04-29 08:19:14

+0

确实如此,但是应该调查所用的STL实现 - 它可能以这种或那种方式工作。 – sharptooth 2009-04-29 08:24:14

0

你可以偶尔会遇到情况下,您会从做一些自己的东西(例如,的std :: string通常有大约24个字节的开销,在性病中的指针12个字节获得更好的性能和内存使用情况::字符串本身以及动态分配的块上的标题块)。

从何处的std :: string转换为const(MB的10片)的char *保存明显的记忆我都在项目上的工作。我不相信这些项目就是你所说的典型。

哦,使用STL会伤害你的编译时间,并在某些时候可能是一个问题。当您的项目导致超过GB的目标文件传递给链接器时,您可能需要考虑多少是模板膨胀。

+1

有很多处理编译时间慢的方法。由于这个原因避免使用STL将是我绝对的最后手段。 – 2009-04-29 09:38:09

3

我会坚持STL类(向量,字符串等)。它们更安全,更易于使用,生产效率更高,内存泄漏的可能性更小,而且AFAIK至少在DEBUG时间(Visual C++)中对边界进行了额外的运行时检查。

然后,测量性能。如果您确定STL类中存在瓶颈,则转到C样式字符串和数组使用。

从我的经验,很有可能会对矢量或字符串使用的瓶颈是非常低的。

+0

+1准确地说,我会回答:) – soulmerge 2009-04-29 09:56:00

0

我已经在几个项目的字符串的内存开销已成为问题。

这是值得提前考虑如何您的应用程序需要扩展。如果您需要存储无限数量的字符串,则将全局管理的字符串表中的const char*用于存储大量内存。

但一般情况下,肯定使用STL类型,除非有很好的理由否则。

0

我相信默认的内存分配技术是向量的缓冲区,字符串是每当当前分配的内存用完时分配内存量的两倍。这可能是浪费。你可以提供一个自定义的分配器当然...

另一件要考虑的是栈与堆。静态大小的数组和字符串可以位于堆栈上,或者至少编译器为您处理内存管理。如果新编译器提供相关的C99/C++ 0x功能,它们也会为你处理动态大小的数组。向量和字符串将始终使用堆,如果您的约束非常紧张,则会导致性能问题。

作为一个经验法则,除非使用它的速度/内存开销来损害您的项目,否则您可能会发现STL提供的类的99%可以节省您的时间和精力,不会影响您的应用程序性能。 (即“避免过早优化”)

相关问题