Как установить значение переменной во время компиляции из выражения? - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь присвоить переменным sizeof значений некоторого типа данных во время компиляции.

Я попробовал следующий код:

constexpr int foo_implementation () {
        return sizeof(int);
}
#define foo std::integral_constant<int, foo_implementation()>::value
int main() {
    int size;
    for(int i=0;i<10;i++) {
        size = foo;
        std::cout<<size<<std::endl;
    }
    return 0;
}

Когда я сбрасываю вывод препроцессора, он простозамените foo полным оператором, что ожидается.

Мой вопрос: размер жесткого кода компилятора будет равен 4 (при условии, что размер int равен 4), или он будет снова и снова вызывать оператор sizeof.

Еслинет, как я могу исправить значение размера во время компиляции на размер int, который известен во время компиляции, чтобы сохранить выполнение дополнительных инструкций во время выполнения?

1 Ответ

0 голосов
/ 05 декабря 2018

Ваш код можно упростить, а #define удалить, чтобы получить:

#include <type_traits>
#include <iostream>

constexpr auto foo = sizeof(int);
int main() {
    int size;
    for(int i=0;i<10;i++) {
        size = foo;
        std::cout<<size<<std::endl;
    }
    return 0;
}

Если вы посмотрите на разборка , вы можете увидеть, что компилятор жестко закодирован 4 в ваш исполняемый файл.Даже без constexpr, sizeof оценивается во время компиляции, а не во время выполнения.

...