[Bug c++/56861] New: std::vector::reserve optimization bug

david at doublewise dot net gcc-bugzilla@gcc.gnu.org
Sun Apr 7 03:13:00 GMT 2013


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: unassigned@gcc.gnu.org
        ReportedBy: david@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)



More information about the Gcc-bugs mailing list