Я читаю книгу Компьютерные системы: перспектива программиста, и я пытаюсь выполнить код, который он предоставляет на моем Macbook Pro с Intel Core i7 ,Настройки среды, необходимые для обучения «Компьютерные системы: перспектива программиста»
Но какой-то код просто не работает точно так, как предлагает книга.
Этот пример C должен демонстрировать, что тот же поплавок будет отличаться при сохранении в памяти от момента его хранения в регистре.
#include<stdio.h>
double recip(int denom)
{
return 1.0/(double) denom;
}
void do_nothing(){} /* to clear the register */
void fcomp(int denom)
{
double r1, r2;
int t1, t2;
r1 = recip(denom); /* stored in memory */
r2 = recip(denom); /* stored in register */
t1 = r1 == r2; /* Compares register to memory */
do_nothing(); /* Forces register save to memory */
t2 = r1 == r2; /* Compares memory to memory */
printf("test1 t1: r1 %f %c= r2 %f\n", r1, t1 ? '=' : '!', r2);
printf("test1 t1: r2 %f %c= r2 %f\n", r1, t2 ? '=' : '!', r2);
}
main(){
int demon = 10;
fcomp(demon);
}
По сравнению с GCC с опцией "O2", результат, предложенной в книге, должно быть:
test1 t1: r1 0.100000 != r2 0.100000
test2 t1: r1 0.100000 == r2 0.100000
Однако, я получил два "==" S и непонятно, почему. Любое предложение о настройках среды для книги? Большое спасибо.
Вы должны хранить книгу на сухом рабочем столе из-под прямых солнечных лучей ... –
Обратите внимание, что любой полуподобный компилятор может доказать, что вызов 'do_nothing()' ничего не делает и просто не испускает для него никакого кода. Упомянутый компилятор также может, кстати, доказать, что «r1» и «r2» должны иметь одинаковое значение и оптимизировать ваши назначения и оптимизировать тернарный оператор в 'printf()' вызывает до прямой '' = ' '. Кроме того, я ничего не вижу в коде, который говорит что-либо о регистрах, поэтому любое предположение о значениях, хранящихся в регистрах, совершенно необоснованно. –
Что-то здесь очень не так. Книга была написана Рэндалом Брайантом, который хорошо известен. Некоторые из книг онлайн. Вы уверены, что ваш фрагмент кода - это то, что находится в книге? Какая глава, раздел и страница? –