+ 6

How counts the operator sizeof(type) the size of a class?

#include <iostream> class A { int i; char charVec[3]; public: const int& size() const { return sizeof(i) + sizeof(charVec); } }; class B { int i; char charVec[5]; public: const int& size() const { return sizeof(i) + sizeof(charVec); } }; int main() { A a; B b; std::cout << "The size of class A with using the operator sizeof: " <<sizeof(A) << std::endl; std::cout << "The correct size of class A: " << a.size() << std::endl; std::cout << "The size of class B with using the operator sizeof: " << sizeof(B) << std::endl; std::cout << "The correct size of class B: " << b.size()<< std::endl; std::cin.get(); std::cin.get(); return 0; }

28th Nov 2018, 3:49 AM
Petros Simidyan
Petros Simidyan - avatar
4 ответов
+ 5
sizeof takes the accumulated object sizes of each member variable. For example the size of an int is 4 bytes, char is 1 byte, short is 2 bytes, any pointer is 4 or 8 bytes ( 32 bit and 64 bit OS ) char[10] is 1 * 10 is 10 bytes. So for class A int + char[3] is 4 + 1 * 3 = 7 bytes. The compiler usually padds this size to a multiple of 4 or 8 for efficiency reasons, so the size could also be 8. In gcc you could do class __attribute((packed)) A{}; then the compiler will not padd it, but don't do that unless you have a good reason to.
28th Nov 2018, 9:16 AM
Dennis
Dennis - avatar
+ 4
I guess (x/4+1)*4, where x is the actual size of the class. But why?
28th Nov 2018, 3:50 AM
Petros Simidyan
Petros Simidyan - avatar
+ 4
Just wanted to add that if a function is marked virtual then another 4 or 8 bytes ( 32 bit vs 64 bit OS ) is added for the virtual jump table.
28th Nov 2018, 2:58 PM
Dennis
Dennis - avatar
+ 2
Thanks, that was my idea too.
28th Nov 2018, 10:37 AM
Petros Simidyan
Petros Simidyan - avatar