"Quản lý bộ nhớ" là trách nhiệm phân tách, thông thường. Hệ điều hành không gian địa chỉ tay trong khối lớn để chạy, sau đó đưa nó ra trong các bit nhỏ hơn cho chương trình. Không gian địa chỉ này có thể có hoặc không có RAM được cấp phát. (Nếu không, sẽ có không gian hoán đổi để sao lưu)
Về cơ bản, khi một DLL được tải, Windows sẽ phân bổ không gian địa chỉ cho mã và phân đoạn dữ liệu và gọi DllMain()
. Trình biên dịch C++ sẽ được sắp xếp để gọi các ctors toàn cầu từ DllMain()
. Nếu đó là DLL được viết bằng C++, nó sẽ có khả năng phụ thuộc vào một DLL thời gian chạy C++, do đó sẽ phụ thuộc vào Kernel32.DLL và User32.DLL. Windows hiểu các phụ thuộc như vậy và sẽ sắp xếp cho chúng được tải theo đúng thứ tự.
Chỉ có một không gian địa chỉ để chứng minh, do đó, một DLL sẽ có quyền truy cập vào tất cả bộ nhớ của quá trình. Nếu một DLL được nạp trong hai quy trình, sẽ có hai bản sao hợp lý của mã và dữ liệu. (bản sao của mã và dữ liệu chỉ đọc có thể chia sẻ cùng một RAM vật lý).
Nếu DLL cấp phát bộ nhớ bằng cách sử dụng chức năng OS, Windows sẽ cấp phát bộ nhớ cho quá trình mà từ đó DLL đã thực hiện phân bổ đó. Quá trình này phải trả lại bộ nhớ, nhưng bất kỳ mã nào trong quá trình có thể làm như vậy. Nếu DLL của bạn cấp phát bộ nhớ bằng cách sử dụng các hàm C++, nó sẽ làm như vậy bằng cách gọi operator new
trong thời gian chạy DLL C++. Bộ nhớ đó phải được trả lại bằng cách gọi operator delete
trong cùng một thời gian chạy DLL C++. Một lần nữa, nó không quan trọng ai làm điều đó.
Các lớp STL như vector<>
có thể được nhân nhanh, nhưng không quan trọng miễn là bạn đang sử dụng cùng một trình biên dịch. Tất cả các instantiations sẽ được bằng nhau đáng kể, và tất cả sẽ trả về bộ nhớ của vectơ cho cùng một hàm deallocation.
Có 2 giả thuyết chính trong lời giải thích này:
- Các EXE và DLL của nó đều được biên soạn với cùng biên dịch
- Các EXE và DLL của nó tất cả các liên kết chống lại C++ runtime DLL (tức là không tĩnh được liên kết)
Kết nối tĩnh với thời gian chạy C++ rất hữu ích nếu bạn muốn gửi một EXE độc lập. Nhưng nếu bạn đã được vận chuyển DLL, bạn nên giữ thời gian chạy C++ trong DLL riêng của nó quá.
Câu hỏi liên quan: http://stackoverflow.com/questions/2266218/ –
Một câu hỏi liên quan khác: http://stackoverflow.com/questions/1634773/ –
Câu trả lời được chấp nhận cho câu hỏi này có những gì bạn cần tôi nghĩ: http : //stackoverflow.com/questions/2154939/ –