cuốn sách gpt4 ai đã làm

Làm thế nào để sắp xếp bộ nhớ các lớp dẫn xuất?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 07:02:13 25 4
mua khóa gpt4 Nike

Tôi đang tìm hiểu về việc căn chỉnh bộ nhớ. Tôi nghĩ rằng tôi hiểu khái niệm này, tôi chỉ muốn đảm bảo bằng một ví dụ xem tôi có hiểu đúng cách thực hành hay không.

Tôi có hai lớp như sau

lớp cơ sở {
int64_t a;
int64_tb;
int64_tc;
int64_t d;

phương thức void ảo();
}

lớp A: Cơ sở công cộng {
// con trỏ ảo 8 byte
// 32 byte Đối tượng cơ sở
// 16 byte Cấu trúc C
dữ liệu C;

ghi đè phương thức void();
}

Lớp A bây giờ là 56 byte. Để căn chỉnh khi sử dụng bộ nhớ A trong một mảng, tôi nghĩ nó cần 8 byte đệm, vì 64 chia hết cho 32, là thành viên lớn nhất của lớp. Vấn đề đầu tiên của tôi là tôi không chắc mình có cần nó hay không, vì các thành viên của Base thực sự được căn chỉnh 8 byte. Ngay cả khi tôi thực sự cần nó, tôi nên đặt phần đệm 8 byte trước "dữ liệu" thành viên hay sau "dữ liệu". Tôi nghĩ trước "dữ liệu" vì C là 16 byte và đặt nó trước "dữ liệu" có nghĩa là "dữ liệu" bắt đầu ở byte 48, chia hết cho 16.

Cảm ơn trước.

EDIT: Tôi quên đưa cái này vào, nhưng A thực sự ghi đè một số phương thức ảo của Base. Đây là nguồn gốc của con trỏ bảng ảo

câu trả lời hay nhất

Chúng ta có thể căn chỉnh một lớp rất đơn giản:

// Lớp này được căn chỉnh giống như int
lớp UnalignedClass {
int x, y, z;
};

// Lớp này hiện được căn chỉnh theo ranh giới 16 byte
lớp căn chỉnh(16) AlignedClass {
int x, y, z;
};

Tương tự, nếu bạn muốn căn chỉnh một lớp dẫn xuất, bạn có thể làm như sau:

lớp cơ sở {
int64_t a;
int64_tb;
int64_tc;
int64_t d;
};
lớp C {
dữ liệu char[16];
};

lớp căn chỉnh (64) A: Cơ sở công cộng {
// Không có con trỏ ảo, vì Base không chứa phương thức ảo
// 32 byte Đối tượng cơ sở
// 16 byte Cấu trúc C
dữ liệu C;
};

Nếu chúng ta in ra kích thước và căn chỉnh chúng ta có thể thấy MỘT Kích thước và căn chỉnh là 64 và trình biên dịch sẽ tự động thêm phần đệm bổ sung.

#include 
int chính() {
std::cout << sizeof(A) << '\n';
std::cout <
}

Tức là bạnkhả thiKhông cần phải căn chỉnh thủ công các lớp học của bạn. Nếu không được chỉ định, căn chỉnh của lớp sẽ là căn chỉnh của thành viên có căn chỉnh lớn nhất. Ví dụ:

class Alignas(64) Foo {} // Foo được căn chỉnh thành 64 byte

class Bar { // Bar CŨNG được căn chỉnh thành 64 byte, vì nó chứa Foo
int x;
int y;
Foo f;
};

Làm cách nào để căn chỉnh bộ nhớ các lớp dẫn xuất? Giới thiệu về c++ - Làm cách nào để căn chỉnh bộ nhớ các lớp dẫn xuất? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/57466270/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress