Локальная переменная (скажем, int) может храниться в регистре процессора, по крайней мере, до тех пор, пока его адрес не нужен нигде. Рассмотрим функцию, вычисляющую что-то, скажем, сложный хеш:Может ли переменная-член (атрибут) находиться в регистре в C++?
int foo(int const* buffer, int size)
{
int a; // local variable
// perform heavy computations involving frequent reads and writes to a
return a;
}
Предположим, что буфер не вписывается в память. Обозначим класс для вычисления хэш из кусков данных, вызывая foo
несколько раз:
struct A
{
void foo(int const* buffer, int size)
{
// perform heavy computations involving frequent reads and writes to a
}
int a;
};
A object;
while (...more data...)
{
A.foo(buffer, size);
}
// do something with object.a
Пример может быть немного неестественно. Важное различие здесь состоит в том, что a
была локальной переменной в свободной функции и теперь является переменной-членом объекта, поэтому состояние сохраняется для нескольких вызовов.
Теперь вопрос: было ли законным компилятор загружать a
в начале метода foo
в регистр и хранить его обратно в конце? Фактически это означало бы, что второй поток, контролирующий объект, никогда не может наблюдать промежуточное значение a
(синхронизация и неопределенное поведение в сторону). При условии, что скорость является основной целью C++, это, по-видимому, разумное поведение. Есть ли что-нибудь в стандарте, которое могло бы заставить компилятор сделать это? Если нет, действительно ли это делают компиляторы? Другими словами, можем ли мы ожидать (возможно, малого) снижения производительности за использование переменной-члена, кроме загрузки и сохранения ее один раз в начале и в конце функции?
Насколько я знаю, сам язык C++ даже не указывает, что такое регистр. Тем не менее, я думаю, что вопрос в любом случае ясен. Это важно, я ценю ответы на стандартную архитектуру x86 или x64.
Проверить флажки "register" и "volatile" – amchacon
@amchacon Действительно у C++ в настоящее время есть ключевое слово 'register'. Но я бы также отметил, что он устарел в C++ 17. –