From: Alex Vinokur Newsgroups: alt.comp.lang.learn.c-c++,comp.lang.c++,comp.os.msdos.djgpp Subject: Holes in structure Date: Tue, 06 Nov 2001 14:07:29 +0200 Organization: Scopus Network Technologies Lines: 353 Message-ID: <3BE7D280.C1732E58@bigfoot.com> NNTP-Posting-Host: gateway.scopus.co.il (194.90.203.161) Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 7bit X-Trace: fu-berlin.de 1005048639 35250082 194.90.203.161 (16 [79865]) X-Mailer: Mozilla 4.7 [en] (Win98; I) X-Accept-Language: en To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com =============================================================== Windows98 gpp : GNU C++ version 2.95.3 20010315/djgpp (release) (djgpp) compiled by GNU C version 2.95.3 20010315/djgpp (release). =============================================================== Hi, Here is some program that detects holes in structure. Its output is not perfectly clear to me. The questions are below (after run-log file). ######################################################### ################### C++ code : BEGIN #################### // File main.c #include #include #include #include //=========================================== //================= DEFINES ================= //=========================================== #define ITEM_INTERNAL_ADDRESS(s, item) &(((s*)0)->item) #define ITEM_ITSELF(s, item) ((s*)0)->item #define SHOW_ITEM_INFO(s, item) \ show_item_info ( \ #s, \ #item, \ gstr_builtin_typename(ITEM_ITSELF(s, item)), \ (size_t)ITEM_INTERNAL_ADDRESS(s, item), \ sizeof (ITEM_ITSELF(s, item)) \ ) #define SHOW_STRUCT_INFO(x) \ show_struct_info ( \ #x, \ sizeof(x) \ ) //=========================================== //============= STATIC VARIABLES ============ //=========================================== static size_t prev_item_size_s = 0; static size_t prev_item_address_s = 0; static size_t size_of_all_items_s = 0; static size_t sum_of_all_holes_s = 0; //=========================================== //=========== AUXILIARY FUNCTIONS =========== //=========================================== //-------------------------------- void show_item_info ( const string& struct_name_i, const string& item_name_i, const string& item_type_name_i, const size_t item_address_i, const size_t item_sizeof_i ) //-------------------------------- { size_t hole_value = 0; hole_value = item_address_i - (prev_item_address_s + prev_item_size_s); cout.setf (ios::left, ios::adjustfield); cout << struct_name_i << "." << setw(6) << item_name_i.c_str() << setw(10) << string (" (" + item_type_name_i + ")").c_str() << "-> Address = " << setw(3) << item_address_i << " : sizeof = " << item_sizeof_i << " : "; if (hole_value) { cout << "Hole = " << hole_value << " (before item)" ; } else { cout << "No hole"; } cout << endl; //------------------------------- prev_item_size_s = item_sizeof_i; prev_item_address_s = item_address_i; size_of_all_items_s += item_sizeof_i; sum_of_all_holes_s += hole_value; } // show_item_info //-------------------------------- void show_struct_info ( const string& struct_type_name_i, const size_t struct_sizeof_i ) //-------------------------------- { cout << "Struct " << struct_type_name_i << " : " << endl << "\t" << "sizeof\t\t = " << struct_sizeof_i << endl << "\t" << "All items sum\t = " << size_of_all_items_s << endl << "\t" << "Diff (" << struct_sizeof_i << " - " << size_of_all_items_s << ")\t = " << (struct_sizeof_i - size_of_all_items_s) << endl << "\t" << "All holes sum\t = " << sum_of_all_holes_s << endl; } // show_struct_info //-------------------------------- void init_counters () //-------------------------------- { prev_item_size_s = 0; prev_item_address_s = 0; size_of_all_items_s = 0; sum_of_all_holes_s = 0; } // init_counters //-------------------------------- #define IF_TYPE(x) if (typeid(T) == typeid(x)) return #x template string gstr_builtin_typename(const T&) //-------------------------------- { IF_TYPE(char); IF_TYPE(short); IF_TYPE(int); IF_TYPE(long); IF_TYPE(float); IF_TYPE(double); return "Undefined typename"; } // gstr_builtin_typenameconst //=========================================== //============= TESTED STRUCTURES =========== //=========================================== //----------- struct type0 { }; //----------- struct type1 { long item1; char item2; short item3; char item4; long item5; long item6; int item7; short item8; short item9; char item10; char item11; long item12; float item13; double item14; char item15; }; //=========================================== //============== MAIN FUNCTION ============== //=========================================== int main () { //------ struct type1 ------ init_counters (); SHOW_ITEM_INFO (type1, item1); SHOW_ITEM_INFO (type1, item2); SHOW_ITEM_INFO (type1, item3); SHOW_ITEM_INFO (type1, item4); SHOW_ITEM_INFO (type1, item5); SHOW_ITEM_INFO (type1, item6); SHOW_ITEM_INFO (type1, item7); SHOW_ITEM_INFO (type1, item8); SHOW_ITEM_INFO (type1, item9); SHOW_ITEM_INFO (type1, item10); SHOW_ITEM_INFO (type1, item11); SHOW_ITEM_INFO (type1, item12); SHOW_ITEM_INFO (type1, item13); SHOW_ITEM_INFO (type1, item14); SHOW_ITEM_INFO (type1, item15); cout << endl; SHOW_STRUCT_INFO (type1); //------ struct type0 ------ init_counters (); cout << endl; cout << endl; SHOW_STRUCT_INFO (type0); return 0; } #################### C++ code : END ##################### ######################################################### ################### Compiling : BEGIN ################### %gpp -v main.c Reading specs from d:/sys/djgpp/lib/gcc-lib/djgpp/2.953/specs gcc version 2.95.3 20010315/djgpp (release) d:/sys/djgpp/lib/gcc-lib/djgpp/2.953/cpp0.exe -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Dunix -Di386 -DGO32 -DDJGPP=2 -DMSDOS -D__unix__ -D__i386__ -D__GO32__ -D__DJGPP__=2 -D__MSDOS__ -D__unix -D__i386 -D__GO32 -D__DJGPP=2 -D__MSDOS -Asystem(unix) -Asystem(msdos) -Acpu(i386) -Amachine(i386) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_pentium__ -imacros d:/sys/djgpp/lib/djgpp.ver -remap main.c D:\SPE\BACKUP\ccXMYhM9.ii GNU CPP version 2.95.3 20010315/djgpp (release) (80386, BSD syntax) #include "..." search starts here: #include <...> search starts here: d:/sys/djgpp/lang/cxx d:/sys/djgpp/lib/gcc-lib/djgpp/2.953/include d:/sys/djgpp/include End of search list. The following default directories have been omitted from the search path: $DJDIR/lib/gcc-lib/djgpp/2.953/../../../../djgpp/include End of omitted list. d:/sys/djgpp/lib/gcc-lib/djgpp/2.953/cc1plus.exe D:\SPE\BACKUP\ccXMYhM9.ii -quiet -dumpbase main.cc -version -o D:\SPE\BACKUP\ccLAGHuy.s GNU C++ version 2.95.3 20010315/djgpp (release) (djgpp) compiled by GNU C version 2.95.3 20010315/djgpp (release). d:/sys/djgpp/bin/as.exe -o D:\SPE\BACKUP\ccyOjq3k.o D:\SPE\BACKUP\ccLAGHuy.s d:/sys/djgpp/lib/gcc-lib/djgpp/2.953/collect2.exe d:/sys/djgpp/lib/crt0.o -Ld:/sys/djgpp/lib/gcc-lib/djgpp/2.953 -Ld:/sys/djgpp/bin -Ld:/sys/djgpp/lib D:\SPE\BACKUP\ccyOjq3k.o -lstdcxx -lm -lgcc -lc -lgcc -Tdjgpp.djl d:/sys/djgpp/bin/stubify.exe -v a.out stubify for djgpp V2.X executables, Copyright (C) 1995 DJ Delorie stubify: a.out -> a.000 -> a.exe #################### Compiling : END #################### ######################################################### ############### Running (log file) : BEGIN ############## %a.exe type1.item1 (long) -> Address = 0 : sizeof = 4 : No hole type1.item2 (char) -> Address = 4 : sizeof = 1 : No hole type1.item3 (short) -> Address = 6 : sizeof = 2 : Hole = 1 (before item) type1.item4 (char) -> Address = 8 : sizeof = 1 : No hole type1.item5 (long) -> Address = 12 : sizeof = 4 : Hole = 3 (before item) type1.item6 (long) -> Address = 16 : sizeof = 4 : No hole type1.item7 (int) -> Address = 20 : sizeof = 4 : No hole type1.item8 (short) -> Address = 24 : sizeof = 2 : No hole type1.item9 (short) -> Address = 26 : sizeof = 2 : No hole type1.item10 (char) -> Address = 28 : sizeof = 1 : No hole type1.item11 (char) -> Address = 29 : sizeof = 1 : No hole type1.item12 (long) -> Address = 32 : sizeof = 4 : Hole = 2 (before item) type1.item13 (float) -> Address = 36 : sizeof = 4 : No hole type1.item14 (double) -> Address = 40 : sizeof = 8 : No hole type1.item15 (char) -> Address = 48 : sizeof = 1 : No hole Struct type1 : sizeof = 52 All items sum = 43 Diff (52 - 43) = 9 All holes sum = 6 Struct type0 : sizeof = 1 All items sum = 0 Diff (1 - 0) = 1 All holes sum = 0 ################ Running (log file) : END ############### Questions. 1. struct type0 (empty) : Why is 'sizeof' = 1? 2. struct type1 : Why is not 'Diff' (between 'sizeof' and 'All items sum') equal 'All holes sum' ? Note. 'Diff' = 9, 'All holes sum' = 6. Where has 3 bytes ('Diff' - 'All holes sum') gone? 3. struct type0 and type1 : Why is not ('Diff' - 'All holes sum') the same value for type0 and type1. Note. type0 : 'Diff' - 'All holes sum' = 1 - 0 = 1 type1 : 'Diff' - 'All holes sum' = 9 - 6 = 3 Thanks, =========================== Alex Vinokur mailto:alexvn AT bigfoot DOT com mailto:alexvn AT dr DOT com http://up.to/alexvn http://go.to/alexv_math ===========================