C++ 在c+中仅使用std::string而不是char数组和std::vector/list而不是数组是否存在实际限制+;?

C++ 在c+中仅使用std::string而不是char数组和std::vector/list而不是数组是否存在实际限制+;?,c++,arrays,list,vector,std,C++,Arrays,List,Vector,Std,我在代码中痴迷地使用向量、列表、字符串和wstring。是否有任何第二十二条军规会让我对使用数组更感兴趣,而不是使用chars和wchars 基本上,如果在支持标准模板库的环境中工作,那么使用基元类型实际上更好吗?如果您不需要实时响应,请坚持您的方法。它们比字符更安全。一个问题是访问元素时的开销。即使使用vector和string,当您通过索引访问元素时,您也需要首先检索缓冲区地址,然后添加偏移量(您不需要手动执行,但编译器会发出这样的代码)。对于原始数组,您已经有了缓冲区地址。在某些情况下,这

我在代码中痴迷地使用向量、列表、字符串和wstring。是否有任何第二十二条军规会让我对使用数组更感兴趣,而不是使用chars和wchars


基本上,如果在支持标准模板库的环境中工作,那么使用基元类型实际上更好吗?

如果您不需要实时响应,请坚持您的方法。它们比字符更安全。

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

您偶尔会遇到这样的情况,即您可以通过自己做一些事情来获得更好的性能或内存使用率(例如,std::string通常有大约24个字节的开销,12个字节用于std::string本身中的指针,并且在其动态分配的块上有一个头块)

我曾经在一些项目中工作过,在这些项目中,从std::string转换为const char*可以节省明显的内存(10 MB)。我不相信这些项目是您所说的典型项目


哦,使用STL会损害编译时间,在某个时候可能是一个问题。当你的项目导致超过GB的对象文件被传递给链接器时,你可能想考虑这有多少是模板膨胀。

< p>我会坚持STL类(向量、字符串等)。。它们更安全、更易于使用、更高效、内存泄漏的可能性更小,而且至少在调试时(Visual C++)对边界进行一些额外的运行时检查

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


根据我的经验,出现向量或字符串使用瓶颈的可能性非常低。

我曾参与过几个项目,其中字符串的内存开销成了问题

值得提前考虑应用程序需要如何扩展。如果需要存储无限数量的字符串,在全局管理的字符串表中使用
const char*
s可以节省大量内存


但是一般来说,除非有很好的理由,否则一定要使用STL类型。

对于99%的时间和99%的标准库实现,您会发现std::Vector足够快,并且使用它们带来的方便和安全性将超过任何小的性能成本

对于那些非常罕见的情况,当您确实需要裸机代码时,您可以将向量视为C样式的数组:

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

C++标准保证了向量的连续分配,保证了工作的有效性。 关于字符串,便利因素变得压倒一切,性能问题往往会消失。如果你转向C风格的字符串,你也会回到使用strlen()之类的函数,这些函数本身就非常低效


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

我相信默认的内存分配技术是向量和字符串的缓冲区,每次当前分配的内存用完时,都会分配双倍的内存量。这可能是浪费。您当然可以提供自定义分配器

另一个要考虑的是堆栈和堆。静态大小的数组和字符串可以堆栈,或者至少编译器处理内存管理。如果提供了相关的C99/C++ + 0x特性,更新编译器也会处理动态大小的数组。向量和字符串总是使用堆,这可以引入。如果您有非常严格的限制,ce性能问题


根据经验,除非STL提供的类的速度/内存开销影响了您的项目,否则请使用已经存在的内容……您可能会发现,STL提供的类为您节省了99%的时间和精力,对您的应用程序性能几乎没有影响。(例如,“避免过早优化”)

这里的诀窍是不要使用
运算符[]
太多了,但是可以使用迭代器。迭代器通常会映射到char*到底层字符数组中。没错,但这应该针对所使用的STL实现进行研究-它可能以这种或那种方式工作。有很多方法可以处理编译速度慢的问题。因此避免使用STL将是我最后一次尝试排序。我看不出在尝试排序时使用向量是如何工作的,当然列表对于这些事情更有效?或者在排序时使用多个向量而不是单个列表更好吗?向量在排序时可能效率不高,也可能效率不高。对整数向量进行排序将比对整数列表进行排序更快,因为使用了向量rtor只需要一个快速交换操作,而列表需要几次指针调整。对于非POD对象,列表可能会更快。但排序在实际代码中是非常罕见的事情。是什么让您认为C++0x会支持动态数组?