sizeof trong C++ có ý nghĩa gì?

struct student{
char grade;
int age;
}
Nếu theo lẽ thường thì sizeof(student) = sizeof(char) + sizeof(int) = 5. Tuy nhiên vì trình biên dịch canh các thành phần theo wordlength nên biến age sẽ được gán vào vùng từ nhớ mới thay vì sử dụng 3 byte còn lại của từ nhớ sử dụng bởi grade. Chính vì thế sizeof(student) = 8. Sự mắc mứu này thường gây ra những lỗi memory, hay cấp phát thừa bộ nhớ rất nghiêm trọng. Để thấy vấn đề rỏ hơn tôi sẽ cung cấp thêm một ví dụ:
struct student{
short grade;
int age;
short point;
int weight;
}
bạn nghĩ mấy sẽ là giá trị của sizeof(student) = ? có phải là sizeof(student) = sizeof(short) + sizeof(int) + sizeof(short) + sizeof(int) = 12. Hi hi tui cũng không biết nữa, bạn nên kiểm tra cái này vì nó tùy thuộc vào trình biên dịch của bạn, về phía mình tôi đoán nó có thể là 16. Trong trường hợp đó bạn nghĩ sao khi bạn muốn cấp phát một vùng nhớ cho 200 students bằng hàm sau:
class = (student*)malloc(200 * sizeof(student));
Có vẻ như vấn đề vẫn chưa đến nổi nghiêm trọng, vậy sẽ thế nào nếu không phải là 200 mà là 200000. Khi đó chúng ta sẽ cần giải quyết vấn đề cấp thừa bộ nhớ ở đây. Tôi có thể làm việc đó như thế nào? thay đổi kiểu dữ liệu trong cấu trúc cho thích hợp? vâng đó là một trong những vấn đề đáng xem xét tuy nhiên trong tình hướng ở trên giải pháp thật sự đơn giản. Chỉ cần thay đổi thứ tự khai báo các thành phần như sau:

struct student{
short grade;
short point;
int age;
int weight;
}

tôi thật sự thích thú khi khám phá ra điều này :p nó cho thấy “the best solution is the simplest solution”
bài sưu tầm

sizeof là một hàm rất phổ biến trong c và hầu như các ngôn ngữ khác cũng hỗ trợ những hàm tương tự. Nó có nhiệm vụ trả về kích thước tính theo bytes của một kiểu dữ liệu cơ bản, con trỏ, mảng, hay một cấu trúc được định nghĩa bởi lập trình viên. Thông thường sizeof được sử dụng khi cần tính toán một cách run time kích thước vùng nhớ muốn cấp phát, hay truy xuất một vị trí nào đó trong bộ nhớ và nhiều mục đích rất thông dụng khác. Với các kiểu dữ liệu căn bản, hay mảng thì vấn đề thật rỏ ràng và đơn giản: sizeof(int) – 4 hay sizeof(arrayA) – tổng size của các phần tử trong nó. Tuy nhiên với các cấu trúc tự định nghỉa (struct) thì chúng ta cần phải lưu ý. Hầu hết các trình biên dịch đối xử với các thành phần trong cấu trúc theo wordlength (4 bytes) ví dụ ta có cấu trúc:struct student{char grade;int age;Nếu theo lẽ thường thì sizeof(student) = sizeof(char) + sizeof(int) = 5. Tuy nhiên vì trình biên dịch canh các thành phần theo wordlength nên biến age sẽ được gán vào vùng từ nhớ mới thay vì sử dụng 3 byte còn lại của từ nhớ sử dụng bởi grade. Chính vì thế sizeof(student) = 8. Sự mắc mứu này thường gây ra những lỗi memory, hay cấp phát thừa bộ nhớ rất nghiêm trọng. Để thấy vấn đề rỏ hơn tôi sẽ cung cấp thêm một ví dụ:struct student{short grade;int age;short point;int weight;bạn nghĩ mấy sẽ là giá trị của sizeof(student) = ?có phải là sizeof(student) = sizeof(short) + sizeof(int) + sizeof(short) + sizeof(int) = 12. Hi hi tui cũng không biết nữa, bạn nên kiểm tra cái này vì nó tùy thuộc vào trình biên dịch của bạn, về phía mình tôi đoán nó có thể là 16. Trong trường hợp đó bạn nghĩ sao khi bạn muốn cấp phát một vùng nhớ cho 200 students bằng hàm sau:class = (student*)malloc(200 * sizeof(student));Có vẻ như vấn đề vẫn chưa đến nổi nghiêm trọng, vậy sẽ thế nào nếu không phải là 200 mà là 200000. Khi đó chúng ta sẽ cần giải quyết vấn đề cấp thừa bộ nhớ ở đây. Tôi có thể làm việc đó như thế nào? thay đổi kiểu dữ liệu trong cấu trúc cho thích hợp? vâng đó là một trong những vấn đề đáng xem xét tuy nhiên trong tình hướng ở trên giải pháp thật sự đơn giản. Chỉ cần thay đổi thứ tự khai báo các thành phần như sau:struct student{short grade;short point;int age;int weight;tôi thật sự thích thú khi khám phá ra điều này :p nó cho thấy “the best solution is the simplest solution”