http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56861
Bug #: 56861 Summary: std::vector::reserve optimization bug Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: da...@doublewise.net std::vector::reserve has a few peculiarities currently, as far as the optimizer is concerned. In some cases, calling reserve with the final size of the vector doesn't improve performance at all, but calling reserve with room for one extra element does. In other cases, calling reserve with exactly the correct amount improves performance, but calling with one extra gives the same performance as no reserve at all. I don't know under what circumstances this happens, but it appears to be somewhat system dependent, and changes with otherwise insignificant changes to the code. This arose from a StackOverflow discussion at http://stackoverflow.com/questions/15707688/why-is-calling-vector-reserverequired-1-faster-than-vector-reserverequired That thread contains the code in the first post, which shows the reserve + 1 situation being fastest. The answer by smossen gives some simple changes that lead to the optimizer always working correctly or working correctly in different situations. Unfortunately, I do not know exactly what causes this, but it happens with and without LTO enabled, depending on the code. smossen believes it has to do with the architecture-specific cost model being misapplied in certain circumstances. Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.7.2/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --disable-build-with-cxx --disable-build-poststage1-with-cxx --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux Thread model: posix gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)