C++ – register variable in C and C++

cgcc

I know the concept of register variable and it's use cases but there are few questions in my mind based on what I have tried.

  1. I cannot access the address of a register variable in C though I can do it C++! Why? Is there any issue in accessing the addressing of a register variable?

  2. Suppose if I declare a string variable in C++ as register, then where will that variable be stored? What is the point in declaring the storage class of non-numeric data types such as 'string' in C++ to be register??

UPDATE:
I thought that C++ allows us to fetch the address of a register variable, as I was not getting any error in my program which is as follows:

#include<iostream>
#include<time.h>

using namespace std;

clock_t beg, en;

int main(){

    int j, k=0;

    beg=clock();
    for(register int i=0;i<10000000;i++){
        /*if(k==0){
            cout<<&i<<endl;    // if this code is uncommented, then C++ rejects the recommendation to make 'i' as register
            k++;
        }*/
    }
    en=clock();

    cout<<en-beg<<endl;

    cout<<&j<<endl<<&k;

    return 0;
}

What I have observed is, if I make the variable 'i' as register and don't try to print the address using '&i' then C++ accepts the recommendation and stores 'i' in register, this can be infered from running time of for loop which will always be around 4-12 ms if 'i' is in register. But if I try to print address of variable 'i' then though I don't get any error but C++ rejects the recommendation and this can be infered from the time of execution of loop which is always more than 25 if i is not register!!

So, basically I cannot fetch address of a variable with storage class as register!! WHY?

Best Answer

The variables of a program (on modern non-embedded architectures) can live in one of 2 places, the RAM and the registers. The RAM is indexed and registers can be accessed directly in the opcodes.

The address of a variable is the index where it lives in the RAM, a register doesn't live in the RAM so there is no way to create a meaningful address for it unless you put it on the stack but that defeats the purpose of the register keyword.

As fun as the keyword is, these days compilers are good enough to decide for themselves which variables never need to get copied on the stack or not (the sub branch there is called register allocation).

And as with most old school optimizations giving hints to the optimizer is more likely to confuse and/or hinder it if you don't know exactly what the results are. Because optimizers are geared towards the idiomatic language constructs, and unless there is a bottle neck in the function don't worry about it. Don't shave off 1 or 2 cycles of a rarely used function when the true bottle neck is the DB access.