Подтвердить что ты не робот

Использует ли использование указателя свойство "register" связанной переменной?

В C ли использование указателя отменяет свойство "register" связанной переменной?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    register int clk=0;    //maybe register maybe not
    int *adr=&clk;         //not a register now? i have its address
    *adr=1;  //if i use this 1000000 times, does it exist in L1 at least?
    printf("%d",clk);
    return 0;

}

Предоставляет ошибку компилятора "не может принимать адрес переменной регистра", но он не регистрирует% 100. это всего лишь шанс.

Это самый медленный цикл?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int *p;
    int i=0;
    p=&i;
for(*p=0;(*p)<100;(*p)++)
{
    //do nothing
}
    printf("%d ",i);
    return 0;

}

Если я делаю почти все указатели-указатели переменных и только три переменные имеют только примитивный тип с ключевым словом "register", компилятор делает эти три переменные "действительно зарегистрированными" с более высокой вероятностью?

OK. Задача решена. Я узнал некоторые сборки и выяснил, что это зависит от уровня оптимизации, а также от изменчивости волатильности. Использование __asm ​​{} гарантирует, что оно вычисляется в регистре. Спасибо.

4b9b3361

Ответ 1

В C запрещается применять & к переменной, объявленной с помощью спецификатора register.

6.7.1

Реализация может обрабатывать любую декларацию реестра просто как автоматическая декларация. Однако независимо от того, является ли адресное хранилище фактически используемый, адрес любой части объекта, объявленного с помощью регистр спецификатора хранилища не может быть вычислен, либо явно ( с использованием унарного и оператора, как описано в 6.5.3.2) или неявно (путем преобразования имени массива в указатель, как описано в 6.3.2.1).

И 6.5.3.2:

Операнд унарного и оператора должен быть либо функцией обозначение, результат оператора [] или унарного * или lvalue, что обозначает объект, который не является бит-полем, и не объявляется с спецификация хранилища регистров.

Что касается С++, если вы используете и с register, он отменяет его значение:

ANSI C не позволяет принимать адрес объекта реестра; это ограничение не распространяется на С++. Однако, если адрес оператор (&) используется для объекта, компилятор должен поместить объект в местоположение, для которого может быть представлен адрес. На практике это означает в памяти, а не в регистре.

Ответ 2

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