Danh mục

Những chủ đề tiến bộ trong C# - Quản lý bộ nhớ bên dưới của C#

Số trang: 10      Loại file: pdf      Dung lượng: 112.42 KB      Lượt xem: 9      Lượt tải: 0    
Thu Hiền

Hỗ trợ phí lưu trữ khi tải xuống: 5,000 VND Tải xuống file đầy đủ (10 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Một trong những ưu điểm của C# là ta không cần quan tâm về việc quản lí bộ nhớ bên dưới vì điều này đã được bộ gom rác ( garbage collector ) của C# làm rồi . mặc dù vậy nếu ta muốn viết các đoạn mã tốt, có hiệu suất cao , ta cần tìm hiểu về cách quản lí bộ nhớ bên dưới.Trong phần này ta sẽ tìm hiểu điều gì xảy ra trong bộ nhớ khi ta dùng các biến. Giá trị các kiểu dữ liệu ta sẽ tìm hiểu những gì xảy ra khi...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# - Quản lý bộ nhớ bên dưới của C# Những chủ đề tiến bộ trong C# Quản lý bộ nhớ bên dưới của C#Một trong những ưu điểm của C# là ta không cần quan tâm về việc quản líbộ nhớ bên dưới vì điều này đã được bộ gom rác ( garbage collector ) của C#làm rồi . mặc dù vậy nếu ta muốn viết các đoạn mã tốt, có hiệu suất cao , tacần tìm hiểu về cách quản lí bộ nhớ bên dưới.Trong phần này ta sẽ tìm hiểuđiều gì xảy ra trong bộ nhớ khi ta dùng các biến.Giá trị các kiểu dữ liệuta sẽ tìm hiểu những gì xảy ra khi ta tạo ra một biến của kiểu giá trị. ta sẽkiểm tra điều gì xảy ra trong bộ nhớ khi thực hiện các dòng lệnh :{int nRacingCars = 10;double engineSize = 3000.0;// do calculations;}Window dùng hệ thống địa chỉ ảo ( virtual addressing) ánh xạ từ địa chỉ bộnhớ mà chương trình ta thấy đến vị trí thực sự trong bộ nhớ vật lý hoặc trênđĩa được quản lí phiá sau window.kết quả là mỗi ứng dụng trên nền xử lí 32-bit thấy được 4GB bộ nhớ , không cần biết bộ nhớ vật lí thực sự có kíchthước bao nhiêu ( nền xử lí 64bit thì bộ nhớ naỳ lớn hơn) 4GB bộ nhớ nàyđược gọi là không gian địa chỉ ảo ( virtual address space ) hay bộ nhớ ảo (virtual memory) .để đơn giản ta gọi nó là bộ nhớmỗi vùng nhớ từ 4GB này được đánh số từ 0 . nếu ta muốn chỉ định 1 giá trịlưu trữ trên 1 phần cụ thể trong bộ nhớ , ta cần cung cấp số đại diện chovùng nhớ này.trong ngôn ngữ cấp cao , như là C# ,VB,C++ ,Java ..1 trongnhững thứ mà trình biên dịch làm là chuyển đổi tên đọc được ( ví dụ tên biến) thành địa chỉ vùng nhớ mà bộ xử lí hiểu.4GB bộ nhớ này thực sự chứa tấtcả các phần của chương trình bao gồm mã thực thi và nội dung của biếnđược dùng khi chương trình chạy. bất kì DLLs đưọc gọi sẽ nằm trong cùngkhông gian địa chỉ này, mỗi mục của mã hoặc dữ liệu sẽ có vùng định nghĩariêngđâu đó trong bộ nhớ là 1 vùng gọi là stack( ngăn xếp) . stack là nơi giá trịkiểu dử liệu được lưu.khi ta gọi phương thức stack cũng được dùng để saochép các thông số được truyền.để hiểu cách stack làm việc.ta cần lưu ý vềphạm vi của biến trong C#. ví dụ :{ int a; // do something { int b; // do something else } }Đầu tiên a được khai báo . thì bên khối bên trong , b được khai báo.sau đókhối bên trong bị ngắt và b ra ngoài phạm vi, a ra ngoài phạm vi , vì thế đờisống của b nằm trong đời sống của a .Chúng ta sẽ xem điều gì xảy ra khi ta khai báo biến nRacingCars vàengineSize từ ví dụ đầuđâu đó trong chương trình có một thứ gọi là con trỏ stack ( stack pointer).Dây đơn gaỉn là 1 biến ( và 1 địa chỉ trong bộ nhớ) mà chỉ cho ta địa chỉ củavùng trống kế tiếp trong stack.khi chương trình chạy,con trỏ stack sẽ trỏ đếnphần cuối của khối bộ nhớ mà được giữ trong stack.( phần sau nói về đặc tính của stack )The stack actually fills downwards, from high memory addresses to lowaddresses. As data is put on the stack, the stack pointer will be adjustedaccordingly, so it always points to just past the next free location. Now, wedont know exactly where in the address space the stack is - we dont need toknow for C# development - but lets say for the sake of argument, thatimmediately before the above code that allocates the variables is executed,the stack pointer contains the value 800000 or, in hexadecimal, 0xC3500).We are taking this memory location just for the sake of argument, to keepthe numbers simple. In fact, later on when we start running code that usespointers, we will see that the stack actually starts round about memorylocation 1243328 (0x12F8C8). However, we can explain the principles ofhow the stack works just as well using any address, so we may as well pick asimple one. We will also mostly use decimal for addresses, again forsimplicity, although it is more common to write memory addresses inhexadecimal format.Tình huống được minh hoạ trong biểu đồ, trong đó ,chữ in đậm chỉ định nộidung của vị trí bộ nhớ,chữ thường chỉ định địa chỉ hoặc 1 mô tả của vị tríỞ điểm này ,biến nRacingCars nằm trong phạm vi và giá trị 10 được đặttrong nó.nếu giá trị 10 được đặt ở vị trí 799996-799999, 4 byte bên dưới vịtrí được trỏ đến bởi con trỏ stack -mà là 4 byte đầu tiên trống trên stack.Dòng kế khai báo biến engineSze, 1 double và khởi tạo n1o với giá trị3000.0. một số double chiếm 8 byte, vì thế giá trị 3000.0 sẽ được đặt ở vị trí799988-799995 torng stack.con trỏ stack sẽ được tăng theo mỗi lần 8 để trỏđến vùng trống dầu tiên trên stack .Các kiểu dữ liệu tham chiếuTa có thể muốn dùng 1 vài phương thức để cấp phát vùng nhớ để lưu trữ dữliệu ,và giữ cho dữ liệu còn giá trị đến sau khi phương thức kết thúc.điều nàycó thể được làm với một toán tử mới - khi là trường hợp trong tất cả các kiểutham chiếu.Nếu ta đã làm việc với các đọan mã quảnl ý bộ nhớ cấp thấp torng quákhứ,ta sẽ quen với stack và heap ...

Tài liệu được xem nhiều: