Đóng gói cấu trúc trong bộ nhớ và tương tác với DLL
Để lưu trữ một phiên bản của cấu trúc, một vùng bộ nhớ liền kề được cấp phát, đủ để chứa tất cả các phần tử.
Không giống như trong C++, ở đây các phần tử của cấu trúc được đặt liên tiếp nhau trong bộ nhớ và không được căn chỉnh theo ranh giới 2, 4, 8 hoặc 16 byte, tùy thuộc vào kích thước của chính các phần tử (các thuật toán căn chỉnh khác nhau tùy thuộc vào trình biên dịch và chế độ hoạt động). Việc căn chỉnh các phần tử có kích thước nhỏ hơn khối được chỉ định được thực hiện bằng cách thêm các biến giả không sử dụng vào thành phần của cấu trúc (chương trình không có quyền truy cập trực tiếp vào chúng). Căn chỉnh được sử dụng để tối ưu hóa hiệu suất bộ nhớ.
MQL5 cho phép thay đổi các quy tắc căn chỉnh nếu cần, chủ yếu khi tích hợp các chương trình MQL với các DLL bên thứ ba mô tả các loại cấu trúc cụ thể. Đối với những cấu trúc này, cần chuẩn bị một mô tả tương đương trong MQL5 (xem phần về nhập thư viện). Điều quan trọng cần lưu ý là các cấu trúc dành cho tích hợp chỉ nên có các trường thuộc một tập hợp kiểu hạn chế trong định nghĩa của chúng. Vì vậy, chúng không thể sử dụng chuỗi, mảng động, cũng như các đối tượng lớp và con trỏ tới các đối tượng lớp.
Việc căn chỉnh được kiểm soát bởi từ khóa pack
được thêm vào tiêu đề của cấu trúc. Có hai tùy chọn:
struct pack(size) identifier
struct identifier pack(size)
2
Trong cả hai trường hợp, kích thước là một số nguyên 1, 2, 4, 8, 16. Hoặc bạn có thể sử dụng toán tử sizeof(built-in_type)
làm kích thước, ví dụ, sizeof(double)
.
Tùy chọn pack(1)
, tức là căn chỉnh theo byte, tương đương với hành vi mặc định khi không có bộ điều chỉnh pack
.
Toán tử đặc biệt offsetof()
cho phép bạn tìm ra độ lệch tính bằng byte của một phần tử cụ thể trong cấu trúc từ điểm bắt đầu của nó. Nó có 2 tham số: đối tượng cấu trúc và định danh phần tử. Ví dụ:
Print(offsetof(Result, status)); // 36
Trước trường status
trong cấu trúc Result
, có 4 giá trị double
và một giá trị int
: tổng cộng 36 byte.
Khi thiết kế cấu trúc của riêng bạn, nên đặt các phần tử lớn nhất lên đầu tiên, sau đó là các phần tử còn lại - theo thứ tự giảm dần kích thước của chúng.