This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/56146] New: Erroneous char initialization only in template function


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56146

             Bug #: 56146
           Summary: Erroneous char initialization only in template
                    function
    Classification: Unclassified
           Product: gcc
           Version: 4.7.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: 2013.bugzilla.gcc.gnu.org@ingomueller.net


Consider the following piece of code:

-------------------
#include <omp.h>
#include <stdio.h>

#define INIT_BODY \
    int mem_size = 1 << 30; \
    \
    double start = omp_get_wtime(); \
    char*  data  = new char[mem_size]; \
    double end   = omp_get_wtime(); \
    \
    printf( "%f s for new char[%i].\n", end - start, mem_size ); \
    delete [] data;

template<typename T> void init1() { INIT_BODY }
void init2() { INIT_BODY }

int main(int argc, char* argv[])
{
    init1<int>(); // with template: takes about a second
    init2(); // without template: takes a few microseconds
}
-------------------

I expect the two functions to behave exactly the same way, as they have exactly
the same body. Note that the template parameter of init1 is not used. However,
in init1, the new char array seems to be initialized. As far as I know, new
arrays of PODs should not be initialized by "new". In any way, it is not
understandable why the two functions differ in their behavior.

Note that I use OpenMP just for its handy timer function. Any other timer (and
compiling without -fopenmp) yields the same result. I also measured the number
of minor page faults, which correspond exactly to what I expect for
initializing the new array. Also note that doubling mem_size doubles both the
time and the number of page faults. Last but not least, inverting the order of
the two function calls or repeating them does not change anything.

Conclusion: I think that arrays constructed by "new" are erroneously
initialized when called from a templated function.

I observed the erroneous behavior (as described above) in the following
compilers:

gcc 4.5.3
gcc 4.6.1
gcc 4.6.2
gcc 4.7.1

I observed the correct behavior (both timers yield the same, very small amount
of time) in the following compilers:

gcc 4.4.3
gcc 4.8-20130120
icc 12.1.2
clang: 3.1

If it matters, I am using Ubuntu 10.04.4.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]