2013-02-17 34 views
5

Tôi đang làm việc trên trình quản lý bộ nhớ bằng cách sử dụng trợ giúp của sách Game Engine Architecture. Hiện tại tôi đang đọc về căn chỉnh bộ nhớ (trong sách và web) và tôi không chắc cách căn chỉnh được sử dụng đúng cho các lớp học. Tôi hiểu khái niệm liên kết bộ nhớ (ví dụ đoạn dữ liệu 4 byte nên được đặt tại địa chỉ kết thúc bằng 0x0, 0x4, 0x8 hoặc 0xC) nhưng ở hàm allocateAligned() -function trong sách là nhận xét cho biết rằng căn chỉnh phải là Sức mạnh của hai. Nếu tôi có một lớp học có hai số int và một số char, sizeof(classs) cho tôi biết rằng lớp đó lớn 12 byte. Vì vậy, bạn sẽ vượt qua 32 như liên kết? Nó sẽ không phải là một sự lãng phí bộ nhớ và có thể dẫn đến sự phân mảnh?
Câu hỏi của tôi là, các lớp phải được căn chỉnh chính xác như thế nào, bạn có thể giải thích cho tôi chi tiết hơn không (điều gì sẽ xảy ra nếu bạn muốn căn chỉnh các khối dữ liệu lớn hơn, như 121 byte) và có ý nghĩa không? (vì bộ xử lý chỉ tìm nạp 8 byte trong một cuộc gọi, nếu tôi được thông báo đúng)?liên kết bộ nhớ của các lớp

+0

16 cũng là sức mạnh của hai. – chepner

+0

Tôi chưa bao giờ nghe về sức mạnh của hai quy tắc này. Gần đây tôi đã học về sự liên kết trong lớp, và nó có vẻ như lớp nên là 12 byte (đệm để phù hợp với kích thước của một 'int'). – gsingh2011

+0

* Căn chỉnh * là sức mạnh của hai, nhưng * kích thước * thì không. –

Trả lời

6

Căn chỉnh loại không bao giờ có thể lớn hơn kích thước của một loại. Điều này là do trong một mảng, có thể không có phần đệm giữa các phần tử.

Cũng quan trọng, tuy nhiên, căn chỉnh loại có thể là nhỏ hơn so với kích thước của loại.

Hãy xem xét loại lớp của bạn: nó có ba thành viên, hai số nguyên 4 byte và một số nguyên 2 byte. Giả sử rằng sự căn chỉnh của một số nguyên 4 byte là 4 byte và sự liên kết của một số nguyên 2 byte là 2 byte (điều này là phổ biến). Trong trường hợp này, việc căn chỉnh loại lớp của bạn chỉ là 4 byte. Nó có thể được đặt trên bất kỳ ranh giới 4 byte nào và mỗi thành viên của nó sẽ được căn chỉnh chính xác.

Đây là lý do loại lớp của bạn có hai byte đệm: 12 chia hết cho bốn, nhưng 10 thì không. Nếu lớp của bạn không có đệm, kích thước của nó sẽ chỉ là 10 byte, và trong một mảng các phần tử một nửa của các đối tượng sẽ bị lệch.

+0

và điều gì sẽ xảy ra nếu tôi có một lớp với một cá thể thành viên lớp 12 byte lớn? – immerhart

+0

@ lunghart: Sắp xếp sẽ vẫn có thể là bốn byte. Sự sắp xếp lớn hơn/chặt chẽ hơn chỉ gây ra bởi các kiểu dữ liệu lạ (có thể là 'long double'?), Không phải bởi các thành viên nhồi vào một' struct'. – aschepler

+0

@ lunghart: Trong trường hợp đó, sự liên kết của loại đó sẽ là một trong 1 byte, 2 byte hoặc 4 byte (đó là các yếu tố của 12 là lũy thừa của 2). –

1

Căn chỉnh của loại có thể nhỏ hơn, nhưng không lớn hơn kích thước của nó. Trên thực 32-bit điển hình, bạn

struct X { 
    int a; 
    int b; 
    char c; 
}; 

có khả năng sẽ có sizeof(X) == 12alignof(X) == 4. Rõ ràng bạn không thể có một X mỗi bốn byte bởi vì họ sau đó sẽ chồng chéo lên nhau, nhưng sự liên kết có nghĩa là 0x1000, 0x1004, 0x1008, và 0x100c là tất cả những nơi tiềm năng bạn có thể bắt đầu một X.

Lưu ý rằng kích thước loại được trả về bởi sizeof luôn là bội số của căn chỉnh, vì sizeof chỉ định số byte giữa các phần tử mảng và bạn sẽ không muốn mục nhập đầu tiên trong một mảng được căn chỉnh chứ không phải thứ hai.

Các vấn đề liên quan