Вопрос по c++ – вызов sizeof при вызове функции фактически пропускает вызов функции!}

7

Я случайно наткнулся на этот кусок кода.

int x(int a){
    std::cout<<a<<std::endl;
    return a + 1;
}

int main()
{
    std::cout<<sizeof(x(20))<<std::endl;
    return 0;
}

Я ожидал, что это напечатает 20 следуют 4. Но это только печатает 4. Почему это происходит так? Разве не правильно оптимизировать функцию, которая имеет побочный эффект (печать в IO / файл и т. Д.)?

Код не вызывает функцию - он даже не манипулирует указателем на функцию. wallyk

Ваш Ответ

5   ответов
15

sizeof является оператором времени компиляции, и операнд никогда не оценивается.

@ChethanRavindranath: не имеет значения, что делает функция.sizeof специально разработан, чтобы избежать любых побочных эффектов, которые может иметь выражение.
Что еще более важно, языковой стандарт прямо говорит, что операндsizeof являетсяnot оценены. (Это очень важно в некоторых методах метапрограммирования, где «вызываемая» функция даже не существует.)
Спасибо! Но, как мы видим, у x () есть побочный эффект печати в поток ввода-вывода. Было бы неправильно не вызывать функцию, потому что мы просто знаем значение sizeof во время компиляции? Chethan Ravindranath
4

sizeof на самом деле оператор, и он оценивается во время компиляции.

Компилятор может оценить это, потому что размер возвращаемого типаx фиксированный; это не может измениться во время выполнения программы.

2

The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is not evaluated, or a parenthesized type-id.

2

функция вызова х (20)

2

sizeof() дает размер типа данных. В вашем случае нет необходимости вызывать функцию для получения типа данных.

Я подозреваю, что sizeof также делает это во время компиляции, а не во время выполнения ...

Похожие вопросы