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. What does #pragma pack(0) do

What does #pragma pack(0) do

Scheduled Pinned Locked Moved C / C++ / MFC
question
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.
  • L Lost User

    Nope. Default size is NOT stating a #pragma pack, which defaults to DWORD, ie 4 byte alignment in structures. #pragma pack 0 means there is no packing between data members, so they are contiguous in memory. --edit-- Actually I am talking crap. pack (1) makes data member contiguous in memory, pack (0) resets packing. DOh! (Just checked my code. Its been a few months since I did any, I guess the old memory is fading....) :)

    ============================== Nothing to say.

    L Offline
    L Offline
    Lakamraju Raghuram
    wrote on last edited by
    #7

    #pragma pack(0)

    #include
    using namespace std;

    struct Test
    {
    char a;
    int i;
    };

    void main()
    {
    cout<

    I am using VS2008 SP1. The build is x86.
    Now guess the result of sizeof(Test) ??

    L Y 2 Replies Last reply
    0
    • L Lakamraju Raghuram

      #pragma pack(0)

      #include
      using namespace std;

      struct Test
      {
      char a;
      int i;
      };

      void main()
      {
      cout<

      I am using VS2008 SP1. The build is x86.
      Now guess the result of sizeof(Test) ??

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #8

      5

      ============================== Nothing to say.

      L 1 Reply Last reply
      0
      • L Lost User

        Nope. Default size is NOT stating a #pragma pack, which defaults to DWORD, ie 4 byte alignment in structures. #pragma pack 0 means there is no packing between data members, so they are contiguous in memory. --edit-- Actually I am talking crap. pack (1) makes data member contiguous in memory, pack (0) resets packing. DOh!

        ============================== Nothing to say.

        C Offline
        C Offline
        Chris Losinger
        wrote on last edited by
        #9

        Erudite_Eric wrote:

        pragma pack 0 means there is no packing between data members, so they are contiguous in memory.

        no. that's pack(1) : align on single bytes. pack(n) specifies the structure alignment, not the number of bytes between structs.

        image processing toolkits | batch image processing

        L 1 Reply Last reply
        0
        • L Lost User

          5

          ============================== Nothing to say.

          L Offline
          L Offline
          Lakamraju Raghuram
          wrote on last edited by
          #10

          I am reading 8 on my console.

          L 1 Reply Last reply
          0
          • Y yu jian

            The msdn says #pragma pack(n) will change current alignment value to n. But if n is zero, what will do?

            C Offline
            C Offline
            CPallini
            wrote on last edited by
            #11

            Why don't you continue reading MSDN? #pragma pack documentation[^] states:

            Valid values are 1, 2, 4, 8, and 16.

            Hence 0 is 'not valid' (I wouldn't try to make assumptions on a value marked as such).

            Veni, vidi, vici.

            Y 1 Reply Last reply
            0
            • Y yu jian

              The msdn says #pragma pack(n) will change current alignment value to n. But if n is zero, what will do?

              L Offline
              L Offline
              Lost User
              wrote on last edited by
              #12

              yu-jian wrote:

              But if n is zero, what will do?

              Add /WX to your compiler settings and recompile. You should pay more attention to compiler warnings. :) Best Wishes, -David Delaune

              Y 1 Reply Last reply
              0
              • L Lakamraju Raghuram

                #pragma pack(0)

                #include
                using namespace std;

                struct Test
                {
                char a;
                int i;
                };

                void main()
                {
                cout<

                I am using VS2008 SP1. The build is x86.
                Now guess the result of sizeof(Test) ??

                Y Offline
                Y Offline
                yu jian
                wrote on last edited by
                #13

                8 in vs2008 sp1

                1 Reply Last reply
                0
                • C CPallini

                  Why don't you continue reading MSDN? #pragma pack documentation[^] states:

                  Valid values are 1, 2, 4, 8, and 16.

                  Hence 0 is 'not valid' (I wouldn't try to make assumptions on a value marked as such).

                  Veni, vidi, vici.

                  Y Offline
                  Y Offline
                  yu jian
                  wrote on last edited by
                  #14

                  Just after read MSDN, I found that the case n=0 is ignored. I do not know why.

                  enhzflepE 1 Reply Last reply
                  0
                  • Y yu jian

                    Just after read MSDN, I found that the case n=0 is ignored. I do not know why.

                    enhzflepE Offline
                    enhzflepE Offline
                    enhzflep
                    wrote on last edited by
                    #15

                    Simply because it's not explicitly handled. Without giving the directive a special meaning for n=0, it makes perfect sense - it keeps the use of the directive consistent.

                    1 Reply Last reply
                    0
                    • L Lost User

                      yu-jian wrote:

                      But if n is zero, what will do?

                      Add /WX to your compiler settings and recompile. You should pay more attention to compiler warnings. :) Best Wishes, -David Delaune

                      Y Offline
                      Y Offline
                      yu jian
                      wrote on last edited by
                      #16

                      There is a error that Visual Studio 2008 only supports 1, 2, 4, 8... After add /WX to compiter.

                      L 1 Reply Last reply
                      0
                      • Y yu jian

                        There is a error that Visual Studio 2008 only supports 1, 2, 4, 8... After add /WX to compiter.

                        L Offline
                        L Offline
                        Lost User
                        wrote on last edited by
                        #17

                        See the documentation[^], which clearly states that the only valid values for n are 1, 2, 4, 8 and 16. Thus using 0 is an invalid #pragma and will be ignored: the default packing (8) will be used.

                        Binding 100,000 items to a list box can be just silly regardless of what pattern you are following. Jeremy Likness

                        Y 1 Reply Last reply
                        0
                        • C Chris Losinger

                          Erudite_Eric wrote:

                          pragma pack 0 means there is no packing between data members, so they are contiguous in memory.

                          no. that's pack(1) : align on single bytes. pack(n) specifies the structure alignment, not the number of bytes between structs.

                          image processing toolkits | batch image processing

                          L Offline
                          L Offline
                          Lost User
                          wrote on last edited by
                          #18

                          Doh! Quite correct. :doh:

                          ============================== Nothing to say.

                          1 Reply Last reply
                          0
                          • L Lakamraju Raghuram

                            I am reading 8 on my console.

                            L Offline
                            L Offline
                            Lost User
                            wrote on last edited by
                            #19

                            Yeah, it is 8, DWORD alignment. I got it wrong... :(

                            ============================== Nothing to say.

                            1 Reply Last reply
                            0
                            • L Lost User

                              See the documentation[^], which clearly states that the only valid values for n are 1, 2, 4, 8 and 16. Thus using 0 is an invalid #pragma and will be ignored: the default packing (8) will be used.

                              Binding 100,000 items to a list box can be just silly regardless of what pattern you are following. Jeremy Likness

                              Y Offline
                              Y Offline
                              yu jian
                              wrote on last edited by
                              #20

                              Thank you for everyone's replies.

                              1 Reply Last reply
                              0
                              • Y yu jian

                                The msdn says #pragma pack(n) will change current alignment value to n. But if n is zero, what will do?

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

                                According to the C++ standard it can do whatever it likes. It's a way of implementors switching on non-standard features of the compiler. I think Griff and the others have told you enough about what it does on VC++ though! Cheers, Ash PS: Except this is the one thread Griff hasn't posted in. Let's try "Chris and the others..." instead!

                                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