Возможно ли иметь тип с большим выравниванием, чем его собственный размер? - PullRequest
3 голосов
/ 16 апреля 2020

Возможно ли когда-нибудь иметь тип в Rust с большим выравниванием, чем его собственный размер? И наоборот, всегда ли компилятор ржавчины добавляет заполнение к типу, чтобы его размер был хотя бы кратным его выравниванию?

Этот простой пример кода может показывать, что ответ отрицательный, все типы имеют размер, который это кратность их выравнивания, но я хотел убедиться, что нет больше эзотерических c возможностей.

use std::mem::{size_of, align_of};

struct b1 {
    byte: u8
}

#[repr(align(4))]
struct b4 {
    byte: u8
}

struct b5 {
    a: u8,
    b: u8,
    c: u8,
    d: u8,
    e: u8,
}

#[repr(align(8))]
struct b8 {
    a: u8,
    b: u8,
    c: u8,
    d: u8,
    e: u8,
}

fn main() {
    assert_eq!(size_of::<b1>(), 1);
    assert_eq!(align_of::<b1>(), 1);

    assert_eq!(size_of::<b4>(), 4);
    assert_eq!(align_of::<b4>(), 4);

    assert_eq!(size_of::<b5>(), 5);
    assert_eq!(align_of::<b5>(), 1);

    assert_eq!(size_of::<b8>(), 8);
    assert_eq!(align_of::<b8>(), 8);
}

Есть похожий вопрос для C ++ , где ответ похоже, «не в стандартном C ++, но некоторые расширения компилятора поддерживают его. В этом случае вы не можете создать массив T».

1 Ответ

2 голосов
/ 16 апреля 2020

Ссылка на Rust говорит о размере и выравнивании (выделение):

Размер и выравнивание

[...]

Размер значения - это смещение в байтах между последовательными элементами в массиве с этим типом элемента, включая отступ выравнивания. Размер значения всегда кратен его выравниванию. Размер значения можно проверить с помощью функции size_of_val.

...