Data structure padding

前端 未结 4 436
感动是毒
感动是毒 2020-12-10 20:10

What is data structure padding in c++ and how do i check the number of bytes padded bytes?

class a { public: int x; int y; int z; };
相关标签:
4条回答
  • 2020-12-10 20:27

    padding is done for performance reasons - see this article Data Structure Alignment for more info.

    To see whether the compiler pads your data structure you could write a simple program:

    #include <iostream>
    
    class a {
    public:
        int x;
        int y;
        int z;
    };
    
    int main()
    {
        std::cout << sizeof(a) << std::endl; // print the total size in bytes required per class instance
    
        a anInstance;
        std::cout << &anInstance.x << std::endl; // print the address of the x member
        std::cout << &anInstance.y << std::endl; // as above but for y
        std::cout << &anInstance.z << std::endl; // etc
    }
    

    I added the public declaration to avoid compiler errors - It will not affect the size or padding.

    Edit: Running this on my macbook air gives the following output: 12 0x7fff5fbff650 0x7fff5fbff654 0x7fff5fbff658

    This shows that on my machine the total size is 12 bytes, and each member is 4 bytes apart. The ints are 4 bytes each (which can be confirmed with sizeof(int)). There is no padding.

    Try this with different members in your class, for example:

    class b {
        public:
            char      w;
            char      x[6];
            int       y;
            long long z;
    };
    
    0 讨论(0)
  • 2020-12-10 20:38

    Processors require that certain types of data have particular alignments. For example, a processor might require that an int be on a 4-byte boundary. So, for example, an int could start at memory location 0x4000 but it could not start at 0x4001. So if you defined a class:

    class a
    {
    public:
        char c;
        int i;
    };
    

    the compiler would have to insert padding between c and i so that i could start on a 4-byte boundary.

    0 讨论(0)
  • 2020-12-10 20:45
    struct A
    {
        char c;
        int i;
    };
    
    int main(int argc, char *argv[])
    {
        A a;
    
        cout << "sizeof struct = " << sizeof(A) << endl;
    
        cout << "sizeof items  = " << sizeof(a.c) + sizeof(a.i) << endl;
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-10 20:50

    Lol just create 2 identical structs, make one of them packed e.g.

    struct foo {
      int  a;
      char b;
      int  c;
    } 
    
    struct bar {
      int  a;
      char b;
      int  c;
    } __attribute__((__packed__));
    

    sizeof(foo) - sizeof(bar) will give you the amount of padding. Or you could also calculate manually like Duck suggested.

    0 讨论(0)
提交回复
热议问题