Struct trong class

Cho e hỏi là : Nếu 1 class chứa object và 1 class chứa struct thì khi khởi tạo 2 class này, bộ nhớ heap sẽ dc cấp phát cho cả 2 class để lưu trữ giá trị biến của nó, class chưa object sẽ có 1 tham chiếu đến object còn class chứa struct sẽ cấp phát bộ nhớ để lưu giá trị của struct trực tiếp chứ ko phải reference như class trên (vì nó là value type). Câu hỏi là khi e thay đổi giá trị của object class đầu, vd class đó có object mà object đó có 2 giá trị x, và y và e muốn thay đổi giá trị y của object đó thì nó vẫn sẽ giữ tham chiếu đến object cũ và sẽ override giá trị y của object đó thôi, còn trường hợp struct của class kia e cũng có x và y và nếu e thay đổi giá trị y thì e phải tạo 1 struct mới overide lại struct cũ trong class thứ 2, vậy nó sẽ tạo thêm bộ nhớ heap để lưu giá trị struct mới đúng ko ạ hay nó override lại đúng cái địa chỉ ô nhớ của cái struct cũ (tức là ko cấp phát ô nhớ mới để lưu giá trị mà viết đè vào địa chỉ của struct cũ).
Cái này e tự nghĩ thôi, cũng hơi mông lung, chỗ nào sai chỉ e với ạ.

Những câu hỏi cụ thể ntn bạn nên đặt tag ngôn ngữ mà bạn muốn đề cập tới. Vì đối với các ngôn ngữ khác nhau sẽ có những cách xử lí khác nhau đối với các khái niệm có tên có vẻ giống nhau

Bản chất của struct chỉ là một danh sách ghi lại các biến và vì bạn cũng đã cấp pháp bộ nhớ heap cho cả class chứa struct rồi thế nên không cần phải ghi đè cái mới

E nghĩ a hiểu nhầm ý e chứ cái này e nghĩ mọi ngôn ngữ đều vậy, vì e thấy ng ta nói các biến của class dc cấp phát bộ nhớ khi object của class dc khởi tạo, chỉ là e thắc mắc về phần value type khi đã dc cấp phát mà change thì nó sẽ ghi đè vào ô nhớ đó hay vào 1 ô nhớ mới, vì e nghe nói struct ko thay đổi giá trị mà nó sẽ khởi tạo hẳn 1 struct mới

ý e là vd nó cấp phát bộ nhớ thì sẽ cấp cả cái struct trong class đó đúng ko? Vậy khi thay đổi giá trị của struct đó nó có ghi đè vào giá trị mà ô nhớ struct cũ ko? Vì e thấy họ bảo struct khi thay đổi giá trị là nó tạo ra 1 struct mới.
Cụ thể hơn VD trong class của e có 1 biến value type int x = 5 đi thì khi e khởi tạo cái object đó thì sẽ có 1 ô nhớ có address 123456 4byte cấp phát chứa giá trị 5 đúng ko? nhưng giờ e change nó thành 7 thì nó sẽ cấp phát 1 ô nhớ 4 byte với địa chỉ khác để lưu số 7 hay nó sẽ viết đè vào ô nhớ 123456 số 7 (ban đầu là số 5) ?

Đương nhiên là khi gán giá trị mới thì nó sẽ ghi đè lại tại vị trí hiện có vì các members của class được lưu trữ tại bộ nhớ của cả đối tượng (ví dụ trong ảnh class B sẽ có kích cỡ là 8 vì struct VectorTwo có 2 int kích cỡ là 4)
Không hiểu bạn đang nghĩ xa về cái gì nữa :DD

1 Like

Không phải đâu e, về tính năng cần tạo mới struct hoặc struct không thay đổi là tuỳ chọn và các ngôn ngữ tuỳ ý định nghĩa. Do đó e nên nói mình đang đề cập đến ngôn ngữ nào.
Đối với các biến kiểu nguyên thuỷ thì đúng là các ngôn ngữ sẽ không có sự khác biệt tuy nhiên struct thì không phải là kiểu nguyên thuỷ.

Như có bạn trên có nói, khi e cấp phát bộ nhớ cho biến kiểu class và biến kiểu struct thì sẽ cấp phát cùng nhớ trên heap. Khi thay đổi giá trị thì sẽ thay đổi trên vùng nhớ đó thôi không cần cấp phát mới. Ý kiến đó là đúng đối với 1 số ngôn ngữ nhưng không đúng với 1 số ngôn ngữ khác. Sẽ có ngôn ngữ struct và class không có sự khác biệt, nhưng có ngôn ngữ có khi thay đổi struct thì nó thực sự copy struct sang vùng nhớ mới + thay đổi còn struct cũ không thay đổi

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?