Нет абсолютно никакой разницы во времени выполнения и, вероятно, нет разницы в скорости компиляции.
Добавлено в ответ на комментарий:
Вот что происходит.Компилятор имеет синтаксический анализатор, вероятно, с рекурсивным спуском, и в нижней части он вызывает лексер для получения токенов.В этом случае токен после =
является числом, которое он может определить по первой цифре, поэтому он выглядит примерно так, где pc
- указатель на текущий символ:
if (isdigit(*pc)){
intpart = 0;
if (pc[0]=='0' && pc[1]=='x'){
pc += 2;
while(ishexdigit(*pc)){
intpart *= 16;
if (isdigit(*pc)){
intpart += (*pc - '0')
}
else {
intpart += (tolower(*pc) - 'a' + 10);
}
pc++;
}
}
else {
while(isdigit(*pc)){
intpart *= 10;
intpart += (*pc - '0');
pc++;
}
if (*pc == '.'){
// ... handle fractional part
}
}
}
В любом случае, как вы можете видеть, это довольно узкий цикл, который выполняет isdigit
или ishexdigit
или tolower
один или два раза для каждого символа числа, а также для умножения, вычитания и сложения.Предполагая, что эти функции встроены, мы говорим, возможно, 10-20 инструкций на символ.В шестнадцатеричном регистре может быть немного больше инструкций на символ, но десятичное число будет содержать несколько больше символов, поэтому трудно сказать a-priori , который должен быть быстрее.Это происходит только для общего числа таких целых чисел, которое у вас было достаточно энергии для ввода в ваш код, например, около 100. Если машина может выполнять, скажем, 10 ^ 8 инструкций в секунду, она может читать цифры со скоростью около10 ^ 7 в секунду, или около 100 наносекунд на символ, или 10 микросекунд для всех чисел в вашем файле, дают или принимают порядок величин.
Как только компилятор узнает, что это число, он просто становится частьюабстрактного синтаксического дерева, которое используется для генерации ассемблера.К тому времени тот факт, что он был шестнадцатеричным или десятичным, уже давно забыт.Все, что он знает, это двоичное целое число определенного значения, поэтому язык ассемблера будет идентичным.