Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. reference to const int

reference to const int

Scheduled Pinned Locked Moved C / C++ / MFC
questionperformance
21 Posts 7 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Aabid

    void main() { const int i = 10; int& j = (int&)i; cout << "i= " << i << endl; cout << "j= " << j << endl; cout << "&i= " << &i << endl; cout << "&j= " << &j << endl; j++; cout << "j= " << j << endl; cout << "i= " << i << endl; } //output i= 10 j= 10 &i= 0012FF60 &j= 0012FF60 j= 11 i= 10 Hi, the code declares a const integer and a reference to it. incrementing a reference adds 1 to j and outputs as 11, that is fine. i was expecting "i" to get modified, since "i" and "j", both having a same memory address, as i print "i", it outputs 10 (or compiler should not allow to increment j). i could not understand the behavior. Could anybody explains me what is going on behind the scene? regards Abid

    A Offline
    A Offline
    Aescleal
    wrote on last edited by
    #12

    If you take the address or reference of a const object and assign it to a non-const pointer or reference and you then modify the value through that pointer or reference the compiler can do whatever it wants. Even laugh at you or fire nuclear missiles (if it's got any) while twirling it's moustache. In C if you declare a constant it's just a read only variable. It has it's own memory location, everything's peachy and works the way you expect. In C++ it really is a constant for the rest of time. It'll never change. Wherever the compiler sees i it can (and probably does) just hardcode the value 10. So what happens when you bind a non-const reference to a const value? Well anything can. But in your compiler's case it cooks up an anonymous temporary variable with the same lifetime as the reference and assigns whatever the constant is to it. This also happens when you take the address of a const as well and assign it to a non-const pointer. What's actually happening is something like:

    int x = 10;

    cout << "i= " << 10 << endl;
    cout << "j= " << x << endl;
    cout << "&i= " << &x << endl;
    cout << "&j= " << &x << endl;

    x++;

    cout << "j= " << x << endl;
    cout << "i= " << 10 << endl;

    The only way you're going to change i is to hunt through the executable code and change the immediate value there :-) Incidentally how this happens is non-portable, it happens on VC++ and GCC but other compilers might have slightly different takes on it.

    1 Reply Last reply
    0
    • C Code o mat

      Additionally to what Richard said, if you change your const int i = 10; to volatile const int i = 10; then you get the expected result (outputting both i and j gives you 11 in the end).

      > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

      A Offline
      A Offline
      Aescleal
      wrote on last edited by
      #13

      The reason for that is that the compiler can't assume that i is fixed any more (you've told it that something somewhere could modify it) so there's a real variable behind it. You're still not allowed to modify it through i though! This sort of trick is really handy for overlaying C++ objects on ranges of addresses for memory mapped devices. Cheers, Ash

      C 1 Reply Last reply
      0
      • A Aescleal

        The reason for that is that the compiler can't assume that i is fixed any more (you've told it that something somewhere could modify it) so there's a real variable behind it. You're still not allowed to modify it through i though! This sort of trick is really handy for overlaying C++ objects on ranges of addresses for memory mapped devices. Cheers, Ash

        C Offline
        C Offline
        Code o mat
        wrote on last edited by
        #14

        Aescleal wrote:

        The reason for that is that the compiler can't assume that i is fixed any more (you've told it that something somewhere could modify it) so there's a real variable behind it.

        I know. :) As far as i know this basically means "don't keep in a register", so the compiler will do its best to keep the memory up-to-date.

        Aescleal wrote:

        You're still not allowed to modify it through i though! This sort of trick is really handy for overlaying C++ objects on ranges of addresses for memory mapped devices.

        I think you shouldn't be able to do it, since usually things are declared as const for a reason, if you need to change them then don't make them const. But of course, there are those nasty situations when doing that can and will come in handy, like when you are using some 3rd party code you are not allowed (or simply don't want) to modify and try to call a method through a const pointer about which you know it does not change the object (like some simple Get method) and realize that the coder who created it kinda forgot to make the method const. Altrough this still might be dangerous because the method's implementation might change in the future and after the next update of the 3rd party library/codebase it borks everything...

        > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

        A J 2 Replies Last reply
        0
        • C Code o mat

          Aescleal wrote:

          The reason for that is that the compiler can't assume that i is fixed any more (you've told it that something somewhere could modify it) so there's a real variable behind it.

          I know. :) As far as i know this basically means "don't keep in a register", so the compiler will do its best to keep the memory up-to-date.

          Aescleal wrote:

          You're still not allowed to modify it through i though! This sort of trick is really handy for overlaying C++ objects on ranges of addresses for memory mapped devices.

          I think you shouldn't be able to do it, since usually things are declared as const for a reason, if you need to change them then don't make them const. But of course, there are those nasty situations when doing that can and will come in handy, like when you are using some 3rd party code you are not allowed (or simply don't want) to modify and try to call a method through a const pointer about which you know it does not change the object (like some simple Get method) and realize that the coder who created it kinda forgot to make the method const. Altrough this still might be dangerous because the method's implementation might change in the future and after the next update of the 3rd party library/codebase it borks everything...

          > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

          A Offline
          A Offline
          Aescleal
          wrote on last edited by
          #15

          I've used this construct for accessing read only registers on an old data collection card. Despite the fact you couldn't write to them an esteemed colleague of mine decided to try anyway. So after making them const as well as volatile he couldn't any more. So it's been handy, er, once in my 23 year programming career. In 1994. It's about the only time I've used placement new as well! As you said, the whole const reference thing is there to make sure you can call things that idiot programmers wrote who didn't understand const. In my experience it's more common when you're calling (very) old C interfaces with pointers. Usually very old C code has an excuse as most C compilers before C90 didn't support const. Hmmm, wonder if it's worth having a C++FAQ on here, this one comes up at least once a year... Cheers, Ash

          C 1 Reply Last reply
          0
          • A Aescleal

            I've used this construct for accessing read only registers on an old data collection card. Despite the fact you couldn't write to them an esteemed colleague of mine decided to try anyway. So after making them const as well as volatile he couldn't any more. So it's been handy, er, once in my 23 year programming career. In 1994. It's about the only time I've used placement new as well! As you said, the whole const reference thing is there to make sure you can call things that idiot programmers wrote who didn't understand const. In my experience it's more common when you're calling (very) old C interfaces with pointers. Usually very old C code has an excuse as most C compilers before C90 didn't support const. Hmmm, wonder if it's worth having a C++FAQ on here, this one comes up at least once a year... Cheers, Ash

            C Offline
            C Offline
            Code o mat
            wrote on last edited by
            #16

            A FAQ? Hmm, that sounds like a good idea to me. There are many topics that seem to come up frequently...

            > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

            1 Reply Last reply
            0
            • C Code o mat

              Aescleal wrote:

              The reason for that is that the compiler can't assume that i is fixed any more (you've told it that something somewhere could modify it) so there's a real variable behind it.

              I know. :) As far as i know this basically means "don't keep in a register", so the compiler will do its best to keep the memory up-to-date.

              Aescleal wrote:

              You're still not allowed to modify it through i though! This sort of trick is really handy for overlaying C++ objects on ranges of addresses for memory mapped devices.

              I think you shouldn't be able to do it, since usually things are declared as const for a reason, if you need to change them then don't make them const. But of course, there are those nasty situations when doing that can and will come in handy, like when you are using some 3rd party code you are not allowed (or simply don't want) to modify and try to call a method through a const pointer about which you know it does not change the object (like some simple Get method) and realize that the coder who created it kinda forgot to make the method const. Altrough this still might be dangerous because the method's implementation might change in the future and after the next update of the 3rd party library/codebase it borks everything...

              > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

              J Offline
              J Offline
              jschell
              wrote on last edited by
              #17

              Code-o-mat wrote:

              I think you shouldn't be able to do it, since usually things are declared as const for a reason

              Pretty sure that the mindset of C++ (and C) is that the developer is a responsible adult and thus they are responsible for the stupid things that they do.

              C A 2 Replies Last reply
              0
              • J jschell

                Code-o-mat wrote:

                I think you shouldn't be able to do it, since usually things are declared as const for a reason

                Pretty sure that the mindset of C++ (and C) is that the developer is a responsible adult and thus they are responsible for the stupid things that they do.

                C Offline
                C Offline
                Code o mat
                wrote on last edited by
                #18

                That probably does carry some truth :) And that's why we love and hate C++

                > The problem with computers is that they do what you tell them to do and not what you want them to do. < > If it doesn't matter, it's antimatter.<

                1 Reply Last reply
                0
                • A Aabid

                  void main() { const int i = 10; int& j = (int&)i; cout << "i= " << i << endl; cout << "j= " << j << endl; cout << "&i= " << &i << endl; cout << "&j= " << &j << endl; j++; cout << "j= " << j << endl; cout << "i= " << i << endl; } //output i= 10 j= 10 &i= 0012FF60 &j= 0012FF60 j= 11 i= 10 Hi, the code declares a const integer and a reference to it. incrementing a reference adds 1 to j and outputs as 11, that is fine. i was expecting "i" to get modified, since "i" and "j", both having a same memory address, as i print "i", it outputs 10 (or compiler should not allow to increment j). i could not understand the behavior. Could anybody explains me what is going on behind the scene? regards Abid

                  J Offline
                  J Offline
                  jschell
                  wrote on last edited by
                  #19

                  Aabid wrote:

                  the code declares a const integer and a reference to it. incrementing a reference adds 1 to j and outputs as 11, that is fine.

                  I don't see that it is "fine". The code is wrong - it shouldn't be written like that in the first place. Once one starts with that then the resulting behavior no longer matters. There are an infinite number of ways to write code incorrectly. There is a large, but finite, number of ways to write code correctly. Myself I don't care what the compiler does with incorrect code.

                  1 Reply Last reply
                  0
                  • J jschell

                    Code-o-mat wrote:

                    I think you shouldn't be able to do it, since usually things are declared as const for a reason

                    Pretty sure that the mindset of C++ (and C) is that the developer is a responsible adult and thus they are responsible for the stupid things that they do.

                    A Offline
                    A Offline
                    Aescleal
                    wrote on last edited by
                    #20

                    Responsible adult? You've never worked in the games industry :-) Biggest bunch of hackers (in the bad sense) out there.

                    J 1 Reply Last reply
                    0
                    • A Aescleal

                      Responsible adult? You've never worked in the games industry :-) Biggest bunch of hackers (in the bad sense) out there.

                      J Offline
                      J Offline
                      jschell
                      wrote on last edited by
                      #21

                      Aescleal wrote:

                      Responsible adult? You've never worked in the games industry :) Biggest bunch of hackers (in the bad sense) out there.

                      I do however have extensive telecom and financial experience and the same thing applies there.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups