Các toán tử đặc biệt sizeof và typename
sizeof
Toán tử sizeof
trả về kích thước của toán hạng của nó theo byte
. Cú pháp toán tử: sizeof(x)
, trong đó x
có thể là một kiểu hoặc một biểu thức. Biểu thức không được tính toán trong trường hợp này, vì toán tử sizeof
được thực thi ở giai đoạn biên dịch và trên thực tế, một hằng số được thay thế vào vị trí của nó trong biểu thức.
Đối với mảng có kích thước cố định, toán tử trả về tổng lượng bộ nhớ được phân bổ, tức là phép nhân số phần tử trong mọi chiều với kích thước kiểu tính bằng byte. Đối với mảng động, toán tử trả về kích thước của cấu trúc bên trong lưu trữ các thuộc tính của mảng.
Chúng ta hãy đưa ra một số ví dụ có giải thích (ExprSpecial.mq5
).
double array[2][2];
double dynamic1[][1];
double dynamic2[][2];
Print(sizeof(double)); // 8
Print(sizeof(string)); // 12
Print(sizeof("This string is 29 bytes long!")); // 12
Print(sizeof(array)); // 32
Print(sizeof(array) / sizeof(double)); // 4 (số lượng các nguyên tố)
Print(sizeof(dynamic1)); // 52
Print(sizeof(dynamic2)); // 52
2
3
4
5
6
7
8
9
10
Kết quả được in trong nhật ký được đánh dấu trong phần bình luận.
Kiểu double
chiếm 8 byte. Kích thước của kiểu string là 12
. 12 byte này lưu trữ thông tin dịch vụ mà chúng ta đã đề cập trong phần xử lý kiểu string . Bộ nhớ này được phân bổ cho bất kỳ chuỗi nào (kể cả chuỗi chưa được khởi tạo). Xin lưu ý rằng một chuỗi chứa văn bản 29 ký tự cũng có kích thước là 12
. Điều này là do cả chuỗi rỗng và chuỗi có một số nội dung đều có cấu trúc bên trong nhằm mục đích lưu trữ tham chiếu đến bộ nhớ. Để có được độ dài văn bản, chúng ta nên sử dụng hàm StringLen
.
Kích thước mảng có kích thước cố định thực sự được tính bằng phép nhân số phần tử (2*2=4
) với kích thước kiểu double (8)
, tổng cộng là 32
. Do đó, một biểu thức như sizeof(array) / sizeof(double)
cho phép tìm ra thực thể của các phần tử trong đó.
Đối với mảng động, kích thước cấu trúc bên trong là 52 byte
. Sự khác biệt trong mô tả của mảng dynamic1
và dynamic2
không ảnh hưởng đến giá trị này.
Toán tử sizeof
đặc biệt hữu ích để lấy kích thước của các lớp và cấu trúc.
typename
Toán tử typename
trả về một chuỗi có tên của tham số được truyền vào, có thể là một kiểu hoặc một biểu thức. Đối với mảng, cùng với từ khóa kiểu dữ liệu, một thẻ được in dưới dạng một cặp dấu ngoặc đơn (hoặc nhiều dấu ngoặc đơn, tùy thuộc vào chiều của mảng).
Print(typename(double)); // double
Print(typename(array)); // double [2][2]
Print(typename(dynamic1)); // double [][1]
Print(typename(1 + 2)); // int
2
3
4
Đối với các kiểu tùy chỉnh, chẳng hạn như lớp, cấu trúc và các kiểu khác (mà chúng ta sẽ xem xét trong Phần 3), tên kiểu sẽ theo sau danh mục thực thể, chẳng hạn như "class MyCustomType"
. Hơn nữa, đối với hằng số, trình sửa đổi "const" sẽ được thêm vào mô tả chuỗi.
Do đó, để biết tên kiểu viết tắt gồm một từ, hãy sử dụng macro TYPENAME
từ tệp đính kèm TypeName.mqh
.
Có thể cần phải tìm hiểu tên kiểu trong cái gọi là mẫu có thể tạo ra các thực thể tương tự từ mã nguồn cho các kiểu khác nhau được xác định trong các tham số của mẫu.