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)

Reply via email to