sizeof(“”+0) != sizeof(char *) Bug or undefined behaviour?

Следующая программа на C:

#include <stdio.h>

int main(void)
{
    printf("%u %u %u\n",sizeof "",sizeof(""+0),sizeof(char *));
    return 0;
}

выводит 1 4 4 при компиляции с GCC в Linux, но выводит 1 1 4 при компиляции с Microsoft Visual C ++ на Windows. Результат GCC - это то, что я ожидал. Отличаются ли они из-за ошибки MSVC или из-за того, что sizeof ("" + 0) не определен? Для обоих компиляторов поведение (то есть, равно ли напечатанное среднее значение первому или последнему значению) одинаково независимо от того, какой строковый литерал или целочисленная константа вы используете.

Соответствующая ссылка в стандарте ANSI C, кажется, быть 6.2.2.1 - Lvalue и указатели функций:

"За исключением случаев, когда это операнд оператора sizeof ... lvalue, имеющий тип 'array of type', преобразуется в выражение, которое имеет тип 'указатель на тип' Случайный случайный = новый Случайный (); startMeasuringTime (); двойной результат; for (int i = ...

I have a class that does some time-consuming calculations. I'm trying to performance test it:

int numValues = 1000000;
Random random = new Random();
startMeasuringTime();
double result;
for (int i = 0; i < numValues; i++) {
    result = calculatorInstance.doSomeTimeConsumingCalculationsOn(random.nextDouble());
}
stopMeasuringTime();

I'm using random values so the compiler won't optimize the calculations for being a million times the same. But what about the results? Does the compiler see it isn't used any more and leaves out the call (but then, can it see any side effects the method call could have?)

I don't want to put the results somewhere (into a file, array or to System.out), because I think this will slow down the test with work that I don't want to measure. Or produce an OutOfMemoryError.

Thanks in advance.

EDIT: changed the title a bit

8
задан nokul 2 February 2011 в 08:46
поделиться