digitalmars.D.learn - size of executables
- Sivo Schilling (159/159) Aug 11 2008 Hi all,
- Christian Kamm (4/19) Aug 11 2008 In the first case DMD will generate a default initializer for the struct...
- Sivo Schilling (5/29) Aug 11 2008 Replay to Christian,
Hi all,
below are two versions of a small test code nailed down from a more complex
project.
In case 1 there are some static arrays inside a struct which is declared at
function scope. Then an instance of this struct is used in the same scope.
Case 2 differs from case 1 only in that the static arrays are placed direct
into the function, but with equal size and layout as before.
--- test_mdsasf.d ---
/***
* test of multi dimensional static arrays
*
* Case 1: - static arrays inside a struct
* - struct declaration at function scope
*/
module test_mdsasf;
import std.stdio;
void fnMDSA()
{
enum
{
SD = 33 // single dimension
}
struct MDSA
{
float[SD][SD][SD] m2;
int[SD][SD][SD] wt;
int[SD][SD][SD] mr;
int[SD][SD][SD] mg;
int[SD][SD][SD] mb;
}
MDSA mdsa;
void initMDSA()
{
// Clear all
(cast(ubyte*)&mdsa)[0..mdsa.sizeof] = 0;
}
void testMDSA()
{
writefln("before init: mdsa.m2[%d][%d][%d] = %f", 13, 4, 11,
mdsa.m2[13][4][11]);
// initialize
initMDSA();
// show result
writefln("after init: mdsa.m2[%d][%d][%d] = %f", 13, 4, 11,
mdsa.m2[13][4][11]);
// assign a value
mdsa.m2[13][4][11] = 13*4*11;
// show result
writefln("after assign: mdsa.m2[%d][%d][%d] = %f", 13, 4, 11,
mdsa.m2[13][4][11]);
}
testMDSA();
}
void main()
{
fnMDSA();
}
--- test_mdsaf.d ---
/***
* test of multi dimensional static arrays
*
* Case 2: - static arrays inside a function
*/
module test_mdsaf;
import std.stdio;
void fnMDSA()
{
enum
{
SD = 33 // single dimension
}
float[SD][SD][SD] m2;
int[SD][SD][SD] wt;
int[SD][SD][SD] mr;
int[SD][SD][SD] mg;
int[SD][SD][SD] mb;
void initMDSA()
{
// Clear all
(cast(ubyte*)&m2)[0..m2.sizeof] = 0;
(cast(ubyte*)&wt)[0..wt.sizeof] = 0;
(cast(ubyte*)&wt)[0..mr.sizeof] = 0;
(cast(ubyte*)&wt)[0..mg.sizeof] = 0;
(cast(ubyte*)&wt)[0..mb.sizeof] = 0;
}
void testMDSA()
{
writefln("before init: m2[%d][%d][%d] = %f", 13, 4, 11, m2[13][4][11]);
// initialize
initMDSA();
// show result
writefln("after init: m2[%d][%d][%d] = %f", 13, 4, 11, m2[13][4][11]);
// assign a value
m2[13][4][11] = 13*4*11;
// show result
writefln("after assign: m2[%d][%d][%d] = %f", 13, 4, 11, m2[13][4][11]);
}
testMDSA();
}
void main()
{
fnMDSA();
}
--- end of files ---
But comparing the size of the two executables is very weird:
case 1: 929.820 bytes (test_mdsasf_v2.exe)
case 2: 216.604 bytes (test_mdsaf_v2.exe)
both compiled with DMD 2.018 (switches: -release -O -inline) on WinXP SP3.
Comparing the corresponding map files it becomes clear that this considerable
size
difference comes from the _DATA section (see <---):
case 1 | case 2:
---------------------------------------------------+--------------------------------------------------
Start Length Name Class | Start Length
Name Class
0002:00000000 0002B40BH _TEXT CODE 32-bit | 0002:00000000 0002CA8BH
_TEXT CODE 32-bit
0002:0002B40C 00000150H ICODE ICODE 32-bit | 0002:0002CA8C 00000150H
ICODE ICODE 32-bit
0003:00000000 00000004H .tls tls 32-bit | 0003:00000000 00000004H
.tls tls 32-bit
0003:00000004 00000004H .tls$ tls 32-bit | 0003:00000004 00000004H
.tls$ tls 32-bit
0003:00000008 00000004H .tls$ZZZ tls 32-bit | 0003:00000008 00000004H
.tls$ZZZ tls 32-bit
0004:00000000 00000004H .CRT$XIA DATA 32-bit | 0004:00000000 00000004H
.CRT$XIA DATA 32-bit
0004:00000010 00000004H .CRT$XIZ DATA 32-bit | 0004:00000010 00000004H
.CRT$XIZ DATA 32-bit
0004:00000020 00000004H .CRT$XCA DATA 32-bit | 0004:00000020 00000004H
.CRT$XCA DATA 32-bit
0004:00000030 00000004H .CRT$XCZ DATA 32-bit | 0004:00000030 00000004H
.CRT$XCZ DATA 32-bit
0004:00000040 00000004H .CRT$XPA DATA 32-bit | 0004:00000040 00000004H
.CRT$XPA DATA 32-bit
0004:00000050 00000004H .CRT$XPZ DATA 32-bit | 0004:00000050 00000004H
.CRT$XPZ DATA 32-bit
0004:00000060 00000004H .CRT$XTA DATA 32-bit | 0004:00000060 00000004H
.CRT$XTA DATA 32-bit
0004:00000070 00000004H .CRT$XTZ DATA 32-bit | 0004:00000070 00000004H
.CRT$XTZ DATA 32-bit
0004:00000074 00000000H IMP__DATA IMP__DATA 32-bit| 0004:00000074 00000000H
IMP__DATA IMP__DATA 32-bit
0004:00000080 000B5168H _DATA DATA 32-bit | 0004:00000080 000059A8H
_DATA DATA 32-bit <---
0004:000B51E8 00000000H FMB DATA 32-bit | 0004:00005A28 00000000H
FMB DATA 32-bit
0004:000B51E8 0000003CH FM DATA 32-bit | 0004:00005A28 0000003CH
FM DATA 32-bit
0004:000B5224 00000000H FME DATA 32-bit | 0004:00005A64 00000000H
FME DATA 32-bit
0004:000B5224 00000000H XIB DATA 32-bit | 0004:00005A64 00000000H
XIB DATA 32-bit
0004:000B5224 00000018H XI DATA 32-bit | 0004:00005A64 00000018H
XI DATA 32-bit
0004:000B523C 00000000H XIE DATA 32-bit | 0004:00005A7C 00000000H
XIE DATA 32-bit
0004:000B523C 00000000H XIFCB DATA 32-bit | 0004:00005A7C 00000000H
XIFCB DATA 32-bit
0004:000B523C 00000004H XIFU DATA 32-bit | 0004:00005A7C 00000004H
XIFU DATA 32-bit
0004:000B5240 00000000H XIFL DATA 32-bit | 0004:00005A80 00000000H
XIFL DATA 32-bit
0004:000B5240 00000004H XIFM DATA 32-bit | 0004:00005A80 00000004H
XIFM DATA 32-bit
0004:000B5244 00000000H XIFCE DATA 32-bit | 0004:00005A84 00000000H
XIFCE DATA 32-bit
0004:000B5244 00000000H XCB DATA 32-bit | 0004:00005A84 00000000H
XCB DATA 32-bit
0004:000B5244 0000000CH XC DATA 32-bit | 0004:00005A84 0000000CH
XC DATA 32-bit
0004:000B5250 00000000H XCE DATA 32-bit | 0004:00005A90 00000000H
XCE DATA 32-bit
0004:000B5250 00000000H CONST CONST 32-bit | 0004:00005A90 00000000H
CONST CONST 32-bit
0004:000B5250 00000000H EEND ENDBSS 32-bit | 0004:00005A90 00000000H
EEND ENDBSS 32-bit
0004:000B5250 000025BCH _BSS BSS 32-bit | 0004:00005A90 000025BCH
_BSS BSS 32-bit
0004:000B780C 00000000H XOB BSS 32-bit | 0004:0000804C 00000000H
XOB BSS 32-bit
0004:000B780C 00000004H XO BSS 32-bit | 0004:0000804C 00000004H
XO BSS 32-bit
0004:000B7810 00000000H XOE BSS 32-bit | 0004:00008050 00000000H
XOE BSS 32-bit
0004:000B7810 00000000H XOFB BSS 32-bit | 0004:00008050 00000000H
XOFB BSS 32-bit
0004:000B7810 00000108H XOF BSS 32-bit | 0004:00008050 00000108H
XOF BSS 32-bit
0004:000B7918 00000000H XOFE BSS 32-bit | 0004:00008158 00000000H
XOFE BSS 32-bit
0004:000B7920 00000419H c_common BSS 32-bit | 0004:00008160 00000419H
c_common BSS 32-bit
0004:000B7D40 00000000H STACK STACK 32-bit | 0004:00008580 00000000H
STACK STACK 32-bit
|
Program entry point at 00023BDC | Program entry point at
0002525C
The difference in size of the _DATA section of the two cases above is
case 1 case 2 delta
000B5168H - 000059A8H = 000AF7C0H --> 718.784 byte!
To this end i've no idea what in case 1 goes into the _DATA section, but i
suppose it's an (hidden ?)
instance of struct MDSA (MDSA.sizeof = 718.740 bytes) at global scope.
What do you think ?
Regards.
Aug 11 2008
Sivo Schilling Wrote:struct MDSA { float[SD][SD][SD] m2; int[SD][SD][SD] wt; int[SD][SD][SD] mr; int[SD][SD][SD] mg; int[SD][SD][SD] mb; } MDSA mdsa;vsfloat[SD][SD][SD] m2; int[SD][SD][SD] wt; int[SD][SD][SD] mr; int[SD][SD][SD] mg; int[SD][SD][SD] mb;In the first case DMD will generate a default initializer for the struct which is probably what you're looking at in the DATA section. I do not think you can stop DMD from doing that - it's part of the TypeInfo instance it generates for the struct. Christian Kamm
Aug 11 2008
Replay to Christian, ok I get it. Structs are treated as POD by the compiler and therefore have a default initializer which have to be present in the executable. Thanks. Christian Kamm Wrote:Sivo Schilling Wrote:struct MDSA { float[SD][SD][SD] m2; int[SD][SD][SD] wt; int[SD][SD][SD] mr; int[SD][SD][SD] mg; int[SD][SD][SD] mb; } MDSA mdsa;vsfloat[SD][SD][SD] m2; int[SD][SD][SD] wt; int[SD][SD][SD] mr; int[SD][SD][SD] mg; int[SD][SD][SD] mb;In the first case DMD will generate a default initializer for the struct which is probably what you're looking at in the DATA section. I do not think you can stop DMD from doing that - it's part of the TypeInfo instance it generates for the struct. Christian Kamm
Aug 11 2008








Sivo Schilling <sivo.schilling web.de>