2017-01-30 7 views
0

Мне интересно узнать поведение спецификатора хранилища register в C/C++. Следующая программа действительна в C++, но в случае C недействительна.Зарегистрировать спецификатор хранилища в C++

int main() 
{ 
     register int i; 
     int* b = &i; // Valid in C++ but not in C 
} 

Итак, мой вопрос, который я, Почему C++ разрешено адрес оператора (&) к регистровой переменной?

P.S: Я знаю register Спецификация хранения устарела в современном компиляторе.

+0

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

+0

По какой причине вы добавили тег C для вопроса C++? Это разные языки! – Olaf

+0

Это действительно скучный ответ, но «потому что стандарт C++ так говорит». В нем говорится, что ключевое слово «register» является «подсказкой к реализации, которую объявленная переменная будет сильно использоваться», а «в большинстве реализаций будет проигнорирована, если будет принят адрес переменной». –

ответ

3

Ваш ответ можно найти здесь:

http://en.cppreference.com/w/cpp/language/storage_duration

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

2

C и C++ расходились до того, как язык C был стандартизован. Оба приняли ключевое слово register, но только C добавили ограничение на оператор &.

Digging в историю, стандарт C++ 98 говорит,

register спецификатор имеет ту же семантику в качестве auto спецификатора вместе с оттенком осуществления, что объект так, объявленный будет в значительной степени используется , [Примечание: подсказка может быть проигнорирована, и в большинстве реализаций она будет игнорироваться, если будет сделан адрес объекта. - конец примечание]

Впоследствии было устаревшим, который представляет собой противоположное направление от укрепления его семантических ограничений. Он запланирован для удаления в предстоящем стандарте C++ 17.

(auto позже перепрофилированы в C++ 11. Его старый смысл был такой же, как хранилище по умолчанию локальной переменной.)

+0

Примечание: C++ 98 не является стандартным C++. Это будет C++ 14. Лучше привести действующий стандарт, даже если он говорит то же самое. – Olaf

+1

@ Olaf Старые стандарты по-прежнему являются стандартными и действительными, просто старыми. Я пошел на старую, потому что это вопрос истории. – Potatoswatter

+0

@Potatoswatter На самом деле новейший стандарт отменяет все остальные стандарты. Поскольку вопрос помечен только C++ (без версии), он должен указывать стандарт на момент написания. – NathanOliver

2

Итак, мой вопрос, который я, Почему C++ оператор позволил адрес (&) к переменной регистра?

Ответ:
Поскольку C и C++ являются различными языками и следовать различным стандартам, как указано в других ответах.

2

Разница объясняется этим цитата из стандарта C++ (Специфического ERS 7.1.1 Класса хранения)

3 Регистр А специфический эр намек на реализацию, что переменные так объявлено будет в значительной степени используются.[Примечание: подсказка может быть проигнорирована и в большинстве реализаций она будет проигнорирована, если принимается адрес переменной . Это использование устарело (см. D.2). -end note]

Смежные вопросы