Передать переменную регистра по ссылке

Я видел код, где переменные с ключевым словом register передаются по ссылке в функции.

Версия 1:

inline static void swap(register int &a, register int &b)
{
register int t = a;
a = b;
b = t;
}

Версия 2:

inline static void swap(register int a, register int b)
{
register int t = a;
a = b;
b = t;
}

Каковы различия между двумя версиями?

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

0

Решение

В программах на Си вы не можете получить адрес переменной регистра.

register int x;
int * p = &x; // Compiler error

Это иногда полезно в макросах, чтобы запретить клиентам брать адрес чего-то, что должно использоваться только в качестве значения.

Использование регистр не рекомендуется в стандарте C ++ 11 (см. [depr.register]). В C ++ допустимо брать адрес регистровой переменной, но недопустимо в последней редакции стандарта C ++ 11 объявлять выравнивание для регистровой переменной с помощью alignas. См. 7.6.2 Спецификация выравнивания

Помимо предотвращения использования alignas () и возникновения синтаксической ошибки при использовании вне локальной сети, регистр ничего не делает в C ++. Поскольку это устарело и я не могу представить причину, по которой вы хотите предотвратить выравнивание переменной, используемой внутри макроса, вам следует избегать использования регистра в коде C ++.

Чтобы ответить на вопрос: в C ++ нет разницы между вашим кодом и эквивалентным кодом с регистр удалены, поэтому ваши «две версии» отличаются очевидным образом.

4

Другие решения

Для программы на C ++ память компьютера похожа на последовательность ячеек памяти, каждый размером в один байт, и каждый с уникальным адресом. Эти однобайтовые ячейки памяти упорядочены таким образом, чтобы представления данных размером более одного байта занимали ячейки памяти, имеющие последовательные адреса.

Таким образом, каждая ячейка может быть легко помещена в память посредством ее уникального адреса. Например, ячейка памяти с адресом 1776 всегда следует сразу за ячейкой с адресом 1775 и предшествует ячейке с 1777, и составляет ровно тысячу ячеек после 776 и ровно тысячу ячеек до 2776.

Когда переменная объявляется, памяти, необходимой для хранения ее значения, назначается определенное место в памяти (ее адрес памяти). Как правило, программы на C ++ активно не определяют точные адреса памяти, в которых хранятся ее переменные. К счастью, эта задача оставлена ​​для среды, в которой запускается программа, — обычно это операционная система, которая определяет конкретные области памяти во время выполнения. Однако может быть полезно, чтобы программа могла получить адрес переменной во время выполнения, чтобы получить доступ к ячейкам данных, которые находятся в определенной позиции относительно нее.

-1

По вопросам рекламы [email protected]