Tôi tò mò - đôi khi tôi thực hiện các thay đổi trong mã, biên dịch lại, sau đó sao chép tệp exe hoặc dll của tôi qua phiên bản cũ và thấy Windows cho biết ngày của tệp đã thay đổi, nhưng kích thước vẫn giữ nguyên. Tại sao vậy?Tại sao những thay đổi nhỏ trong mã không ảnh hưởng đến kích thước tệp exe?
Như một ví dụ, tôi đã thử nghiệm với các ứng dụng giao diện điều khiển sau:
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);
}
}
}
này tạo ra một tập tin exe của 5120 byte (Visual Studio 2012, Debug xây dựng). Sau đó, tôi đã thay đổi mã này:
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);
}
}
}
Kích thước của exe hoàn toàn giống nhau.
tôi nhìn vào tháo dỡ, được thể hiện một sự khác biệt trong các mã IL, vì vậy nó không thể là rằng sự khác biệt được tối ưu hóa đi:
Đầu tiên phiên bản:
.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
phiên bản thứ hai:
.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
Nếu mã lớn hơn về mặt thể chất, thì các tệp có kích thước chính xác như thế nào? Đây có phải là một cơ hội ngẫu nhiên không? Điều đó xảy ra với tôi rất nhiều (khi thực hiện các thay đổi nhỏ đối với mã) ...
Trong một từ: căn chỉnh. – Fizz
5120 chính xác là 10 ngành. Hình như một số đệm. Có lẽ cũng liên kết (nếu mã thực tế được theo sau bởi cái gì khác mà nên được liên kết theo ngành). – morfizm