Что делает «указатель на переменную регистра» как параметр функции? - PullRequest
0 голосов
/ 01 июня 2018

Как я понимаю, спецификатор register подсказывает компилятору сохранить переменную в регистре.Это было все нормально, пока я не наткнулся на следующее объявление в XKBlib.h из Xorg-7.7:

extern  int     XkbTranslateKeySym(
    Display *           /* dpy */,
    register KeySym *       /* sym_return */,
    unsigned int        /* modifiers */,
    char *          /* buffer */,
    int             /* nbytes */,
    int *           /* extra_rtrn */
);

Обратите внимание, как sym_return передается как указатель для регистрации переменной .Меня удивляет то, что

  1. это кажется допустимым, несмотря на невозможность получения адреса переменной регистра,
  2. это, кажется, каким-то образом важно упомянуть в объявлении функции.

Точка 1. кажется недействительной, потому что я могу передать указатель на переменную, отличную от register, даже с флагом -pedantic-errors для GCC.

Итак, что же меняет это объявление по сравнению с тем, в котором пропущено ключевое слово register?Это меняет соглашение о вызовах или как?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Ключевое слово register является в основном устаревшей функцией в современном C. Оно делает две вещи:

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

В вашем случае этоговорит, что указатель сам , а не данные, на которые указывают, предпочтительно должен храниться в регистре, предположительно регистре адреса / индекса.Из стандартного представления C он не делает ничего, кроме этого.

Возможно, что некоторый экзотический компилятор выбирает определенное соглашение о вызовах, когда ему присваивается register как часть функции, хотя я никогда не виделчто раньше.Практика для соглашения о вызовах - это нечто вроде: «если параметр n является указателем, сохраните его в индексном регистре x, если параметр n + 1 является указателем, сохраните его индексным регистром y» и т. П.

Я подозреваю, что наиболее вероятное объяснение ключевого слова register в том, что программист не знал, что они делают.Тем более что в заголовке не было никаких комментариев по этому поводу - это довольно верный признак некомпетентности.Если рассматривать заголовок в целом, есть много других признаков, поддерживающих теорию некомпетентности, таких как эта вопиющая ошибка: #define XkbLC_BeepOnComposeFail (1<<31).Если вы сможете найти UB в течение нескольких минут после краткого обзора источника, держитесь подальше от него.

0 голосов
/ 01 июня 2018

Это не берет адрес регистровой переменной, т.е. это не указатель на регистровую переменную.Скорее это намекает на то, что сам указатель (помните, указатели просто переменные) должен быть помещен в регистр.

...