Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Căn chỉnh bộ nhớ cho cấu trúc (struct alignment)

    Khi trình biên dịch cấp phát bộ nhớ cho một cấu trúc (struct) gồm nhiều trường (field), mỗi trường có kích thước sis_isi​ byte (luôn là một trong các giá trị 1,2,4,8,161, 2, 4, 8, 161,2,4,8,16). Để tăng hiệu năng truy cập bộ nhớ, mỗi trường phải được đặt tại một offset (địa chỉ tương đối so với đầu cấu trúc) là bội số của chính kích thước của nó — gọi là căn chỉnh tự nhiên (natural alignment).

    Các trường được xếp liên tiếp theo đúng thứ tự khai báo. Nếu offset hiện tại chưa là bội số của sis_isi​, trình biên dịch phải chèn phần đệm (padding) ngay trước trường đó cho tới khi thoả điều kiện căn chỉnh, rồi mới đặt trường và tăng offset thêm sis_isi​. Sau khi đặt xong trường cuối cùng, tổng kích thước của cấu trúc còn phải được làm tròn lên tới bội số của kích thước căn chỉnh lớn nhất trong tất cả các trường (gọi là max alignment của struct).

    Cho danh sách kích thước các trường theo đúng thứ tự khai báo, hãy tính tổng kích thước (byte) mà trình biên dịch sẽ cấp phát cho cấu trúc.

    Ví dụ: với các trường kích thước 1,4,2,81, 4, 2, 81,4,2,8 (giống char, int, short, double):

    • trường 1 (size 1): offset 0 → 1
    • trường 2 (size 4): offset 1 chưa chia hết cho 4 → đệm lên offset 4 → 8
    • trường 3 (size 2): offset 8 chia hết cho 2 → 10
    • trường 4 (size 8): offset 10 chưa chia hết cho 8 → đệm lên offset 16 → 24
    • max alignment = 8; 24 đã chia hết cho 8 → kích thước cuối cùng là 24.
    Input:
    4
    1 4 2 8
    
    Output:
    24
    
    • Định dạng đầu vào:

      Dòng 1: số nguyên nnn (1≤n≤10001 \le n \le 10001≤n≤1000) — số trường. Dòng 2: nnn số nguyên s1,s2,…,sns_1, s_2, \ldots, s_ns1​,s2​,…,sn​ cách nhau bởi dấu cách, mỗi số thuộc {1,2,4,8,16}\{1, 2, 4, 8, 16\}{1,2,4,8,16} — kích thước từng trường theo đúng thứ tự khai báo.

    • Định dạng đầu ra:

      In ra một số nguyên duy nhất — tổng kích thước (byte) của cấu trúc sau khi cấp phát.

    Ví dụ:

    Đầu vào:

    4
    1 4 2 8
    

    Đầu ra:

    24
    

    Đầu vào:

    1
    1
    

    Đầu ra:

    1
    

    Đang tải editor...