Как я знаю, соглашается ли gcc, что что-то энергозависимо?

Вам необходимо заменить эту строку r head(mydata) на

```{r}
head(mydata)```
8
задан Tim Post 13 March 2009 в 12:59
поделиться

7 ответов

Много компиляторов в некоторых ситуациях не рассматривают энергозависимый способ, которым они должны. См. данную статью, если Вы имеете дело очень с летучими веществами для предотвращения противных неожиданностей: Летучими веществами является Miscompiled, и Что Делать с этим. Это также содержит довольно хорошее описание энергозависимого, поддержанного цитатами из стандарта.

Чтобы быть на 100% уверенным, и для такого простого примера проверяют вывод блока.

14
ответ дан 5 December 2019 в 04:35
поделиться

Попытайтесь установить переменную вне цикла и считать ее в цикле. В энергонезависимом случае компилятор мог бы (или не мог бы) пихать его в регистр или делать его временем компиляции постоянный или что-то перед циклом, так как он "знает", что он не собирается изменяться, тогда как, если это энергозависимо, он будет читать, он от переменной располагает с интервалами каждый раз через цикл.

В основном, когда Вы объявляете что-то как энергозависимое, Вы говорите компилятору не делать определенную оптимизацию. Если это решило не сделать ту оптимизацию, Вы не знаете, что это не сделало их, потому что это было объявлено энергозависимое, или просто что это решило, что этому были нужны те регистры для чего-то еще, или это не заметило, что могло превратить его в постоянное время компиляции.

12
ответ дан 5 December 2019 в 04:35
поделиться

Насколько я знаю, энергозависимый помогает оптимизатору. Например, если Ваш код был похож на это:

int foo() {
    int x = 0;
    while (x);
    return 42;
}

"В то время как" цикл был бы оптимизирован из двоичного файла.

Но если Вы определяете 'x', как являющийся энергозависимым (т.е., volatile int x;), затем компилятор оставит цикл в покое.

6
ответ дан 5 December 2019 в 04:35
поделиться

Ваш небольшой образец является несоответствующим для показа чего-либо. Различие между энергозависимой переменной и той, которая не является, - то, что каждая загрузка или хранилище в коде должны генерировать точно одну загрузку или хранилище в исполняемом файле для энергозависимой переменной, тогда как компилятор является бесплатным оптимизировать далеко загрузки или хранилища энергонезависимых переменных. Если бы Вы получаете одну загрузку меня в Вашем образце, это - то, что я ожидал бы для энергозависимого и энергонезависимого.

Для показа различия Вы оказываетесь перед необходимостью иметь избыточные загрузки и/или хранилища. Попробуйте что-то как

int i = 5;
int j = i + 2;
i = 5;
i = 5;
printf("%d %d\n", i, j);

изменение i между энергонезависимым и энергозависимым. Вам, вероятно, придется позволить некоторому уровню оптимизации видеть различие.

Код там имеет три хранилища и две загрузки меня, который может быть оптимизирован далеко к одному хранилищу и вероятно одной загрузке, если я не энергозависим. Если я объявляюсь энергозависимый, все хранилища и загрузки должны обнаружиться в объектном коде в порядке, независимо от того, что оптимизация. Если они не делают, у Вас есть ошибка компилятора.

5
ответ дан 5 December 2019 в 04:35
поделиться

Это должно всегда рассматривать его как энергозависимый.

Причина код является тем же, состоит в том, что энергозависимый просто дает компилятору команду загружать переменную из памяти каждый раз, когда это получает доступ к нему. Даже с оптимизацией на, компилятор все еще должен загрузиться i из памяти однажды в коде, который Вы написали, потому что это не может вывести значение меня во время компиляции. При доступе к нему неоднократно Вы будете видеть различие.

4
ответ дан 5 December 2019 в 04:35
поделиться

Любой современный компилятор имеет несколько этапов. Один из довольно легких все же интересных вопросов - было ли объявление самой переменной проанализировано правильно. Это легко, потому что искажение имени C++ должно отличаться в зависимости от энергозависимого. Следовательно, если Вы компилируете дважды, после того как с энергозависимым, определенным далеко, таблицы символов должны отличаться немного.

4
ответ дан 5 December 2019 в 04:35
поделиться

Прочитайте стандарт перед неверной цитатой или downvote. Вот кавычка от n2798:

7.1.6.1 Спецификаторы условной цены

7 Примечаний: энергозависимый подсказка к реализации для предотвращения агрессивной оптимизации, включающей объект, потому что значение объекта могло бы быть изменено средствами, необнаруживаемыми реализацией. См. 1.9 для подробной семантики. В целом, семантика энергозависимых предназначаются, чтобы быть тем же в C++, как они находятся в C.

Ключевое слово volatile действия как подсказка. Во многом как register ключевое слово. Однако volatile просит компилятор держать всю свою оптимизацию в страхе. Таким образом, это не сохранит копию переменной в регистре или кэше (для оптимизации скорости доступа), а скорее выберет его от памяти каждый раз, Вы запрашиваете на него.

С тех пор существует большая часть беспорядка:еще немного. в стандарте C99 действительно на самом деле говорится, что энергозависимый квалифицированный объект должен искаться каждый раз, когда он читается и так далее, как другие отметили. Но, существует также другой раздел, который говорит, что то, что составляет энергозависимый доступ, является определенной реализацией. Так, компилятор, который очень хорошо знает аппаратные средства, будет знать, например, когда у Вас будет автоматическая энергозависимая квалифицированная переменная и чей адрес никогда не берется, что это не будет помещено в чувствительный регион памяти и почти наверняка проигнорирует подсказку и оптимизирует его далеко.

Это ключевое слово находит использование в setjmp и longjmp тип обработки ошибок. Единственная вещь, которую необходимо принять во внимание, состоит в том что: Вы предоставляете энергозависимое ключевое слово, когда Вы думаете, что переменная может измениться. Таким образом, Вы могли взять обычный объект и справиться с несколькими бросками.

Другой вещью иметь в виду является определение того, что составляет энергозависимый доступ, оставлен стандартом реализации.

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

4
ответ дан 5 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

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