size of an empty class??
-
Hi einstines, i was asked this question at an interview:
class a { }; main() { cout<//WHATS THE OUTPUT? }
I can obviously run the program to find the output but i need an explanation about the output. PLEASE ANSWER: WHAT IS THE OUTPUT???? ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
-
Hi einstines, i was asked this question at an interview:
class a { }; main() { cout<//WHATS THE OUTPUT? }
I can obviously run the program to find the output but i need an explanation about the output. PLEASE ANSWER: WHAT IS THE OUTPUT???? ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
i did just that in VC++ class A { }; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int i = sizeof(A); cout << "Sizeof A:" << i << endl; } it displayed 1. I switched to assebmly listing and the linker has generated the following code: 77: int i = sizeof(A); 004018AB mov dword ptr [i],1 <----- Notice here, the linker knew its an empty class and automatically replaced its size by 1 78: 79: cout << "Sizeof A:" << i << endl; 004018B2 mov esi,esp 004018B4 mov edx,dword ptr [__imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z 004018BA push edx 004018BB mov edi,esp 004018BD mov eax,dword ptr [i] 004018C0 push eax 004018C1 mov ebx,esp 004018C3 push offset string "Sizeof A:" (004130d4) 004018C8 mov ecx,dword ptr [MSVCP60D_NULL_THUNK_DATA (00415234)] 004018CE push ecx 004018CF call dword ptr [__imp_??6std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z (004 004018D5 add esp,8 004018D8 cmp ebx,esp 004018DA call _chkesp (004014bc) 004018DF mov ecx,eax 004018E1 call dword ptr [__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z (0041523c) 004018E7 cmp edi,esp 004018E9 call _chkesp (004014bc) 004018EE mov ecx,eax 004018F0 call dword ptr [__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01 004018F6 cmp esi,esp 004018F8 call _chkesp (004014bc) Papa while (TRUE) Papa.WillLove ( Bebe ) ;
-
i did just that in VC++ class A { }; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int i = sizeof(A); cout << "Sizeof A:" << i << endl; } it displayed 1. I switched to assebmly listing and the linker has generated the following code: 77: int i = sizeof(A); 004018AB mov dword ptr [i],1 <----- Notice here, the linker knew its an empty class and automatically replaced its size by 1 78: 79: cout << "Sizeof A:" << i << endl; 004018B2 mov esi,esp 004018B4 mov edx,dword ptr [__imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z 004018BA push edx 004018BB mov edi,esp 004018BD mov eax,dword ptr [i] 004018C0 push eax 004018C1 mov ebx,esp 004018C3 push offset string "Sizeof A:" (004130d4) 004018C8 mov ecx,dword ptr [MSVCP60D_NULL_THUNK_DATA (00415234)] 004018CE push ecx 004018CF call dword ptr [__imp_??6std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z (004 004018D5 add esp,8 004018D8 cmp ebx,esp 004018DA call _chkesp (004014bc) 004018DF mov ecx,eax 004018E1 call dword ptr [__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z (0041523c) 004018E7 cmp edi,esp 004018E9 call _chkesp (004014bc) 004018EE mov ecx,eax 004018F0 call dword ptr [__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01 004018F6 cmp esi,esp 004018F8 call _chkesp (004014bc) Papa while (TRUE) Papa.WillLove ( Bebe ) ;
Ya, thanx for ur reply and to tell the technique to see linker output ;) (thats a new thing i learnt) But, why 1? is it property of the linker or a C++ standard to make size of an empty class as 1. Please tell. ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
-
Ya, thanx for ur reply and to tell the technique to see linker output ;) (thats a new thing i learnt) But, why 1? is it property of the linker or a C++ standard to make size of an empty class as 1. Please tell. ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
Never tested it on unix, but one thing im sure of, is that empty structs are forbidden if you compile the file as a c file and not as a cpp. However while permitting generation of an empty class, the linker is forced to allocate some space for it (vtable ...) and cos its empty, sizeof just returned the minimal size reserved for a class. Papa while (TRUE) Papa.WillLove ( Bebe ) ;
-
Hi einstines, i was asked this question at an interview:
class a { }; main() { cout<//WHATS THE OUTPUT? }
I can obviously run the program to find the output but i need an explanation about the output. PLEASE ANSWER: WHAT IS THE OUTPUT???? ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
avenger_sb25 wrote: WHAT IS THE OUTPUT???? It won't be zero, as that would allow two different objects to have the same address. If
sizeof(a)
returned 0, then the following would be allowed:main()
{
a a1, a2;
if (&a1 == &a2)
... // if we get here, the compiler is faulty
}
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
-
Hi einstines, i was asked this question at an interview:
class a { }; main() { cout<//WHATS THE OUTPUT? }
I can obviously run the program to find the output but i need an explanation about the output. PLEASE ANSWER: WHAT IS THE OUTPUT???? ...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
From the Standard (1.8.5) Unless it is a bitfield, a most derived object shell have a non-zero size and shell occupy one ore more bytes of storage. Base class sub-objects may have zero size.
-
Never tested it on unix, but one thing im sure of, is that empty structs are forbidden if you compile the file as a c file and not as a cpp. However while permitting generation of an empty class, the linker is forced to allocate some space for it (vtable ...) and cos its empty, sizeof just returned the minimal size reserved for a class. Papa while (TRUE) Papa.WillLove ( Bebe ) ;
VTable is only allocated if the class actually contains virtual functions. The size of an empty class will always be greater than zero because two objects must not occupy the same space. (As DavidCrow pointed out)
-
From the Standard (1.8.5) Unless it is a bitfield, a most derived object shell have a non-zero size and shell occupy one ore more bytes of storage. Base class sub-objects may have zero size.
Base class sub-objects may have zero size Can u please give a working example. I did
class p { }; class q: public p { }; p o1; q o2; cout< I get 1 in both. Thank you. ...Avenger * * * Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs