Sono curioso - a volte apporto modifiche nel mio codice, ricompilare, quindi copiare il mio file exe o dll sulla vecchia versione e vedere Windows che mi dice che la data del file è cambiata, ma la dimensione è rimasta esattamente la stessa. Perché?Perché le piccole modifiche al codice non influiscono sulle dimensioni del file exe?
Per fare un esempio, ho provato con la seguente applicazione di console:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
int a = 1;
int b = 2;
Console.WriteLine(a + b);
}
}
}
Questo ha prodotto un file exe di 5120 byte (di Visual Studio 2012, build di debug). Poi, ho cambiato il codice a questo:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
int a = 1;
int b = 2;
int c = 3;
Console.WriteLine(a + b + c);
}
}
}
La dimensione del exe è esattamente la stessa.
guardo lo smontaggio, che sta mostrando una differenza nel codice IL, quindi non può essere che la differenza è ottimizzato via:
Prima versione:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 2
.locals init (int32 V_0,
int32 V_1)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldc.i4.2
IL_0004: stloc.1
IL_0005: ldloc.0
IL_0006: ldloc.1
IL_0007: add
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: nop
IL_000e: ret
} // end of method Program::Main
Seconda versione:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 19 (0x13)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] int32 c)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldc.i4.2
IL_0004: stloc.1
IL_0005: ldc.i4.3
IL_0006: stloc.2
IL_0007: ldloc.0
IL_0008: ldloc.1
IL_0009: add
IL_000a: ldloc.2
IL_000b: add
IL_000c: call void [mscorlib]System.Console::WriteLine(int32)
IL_0011: nop
IL_0012: ret
} // end of method Program::Main
Se il codice è fisicamente più grande, come possono i file essere esattamente della stessa dimensione? Questa è solo una possibilità casuale? Mi capita molto (quando si apportano piccole modifiche al codice) ...
In una parola: allineamento. – Fizz
5120 è esattamente 10 settori. Sembra un po 'di imbottitura. Forse anche l'allineamento (se il codice attuale è seguito da qualcos'altro che dovrebbe essere allineato al settore). – morfizm