如何找出(运行程序时)结构体是如何对齐的?

问题描述 投票:0回答:1

我有一个结构体

Data
,它将在数组中被频繁访问,因此将其与特定大小对齐做出了重大改进。

但是它的成员变量可以通过宏(

f32
f64
)配置为不同类型(
pub type Float = f32;
pub type Float = f64;
)。当数据类型更改时,我可以重新编译程序。问题是:对于这两种类型,如果考虑性能,我应该将
Data
与不同的大小(32 字节或 64 字节)对齐。

那么我如何定义一个函数来检测不正确的对齐方式,以便在运行该程序时发出警告? 例如

if type_name::<Float>() == "f64" && alignment(Data) == 32 {
    panic!("You should align Data with 64 bytes instead of 32 bytes");
}

或者甚至,通过宏或其他东西从

32
参数化
#[repr(align(32))]


完整代码:

pub type Float = f32;
//pub type Float = f64;

#[repr(align(32))]
struct Data {
    value: [Float; 6],
    offset: u32,
    num: u16,
    axis: u8,
}

fn main() {
    // data f32 -> 32
    // data f64 -> 56
    println!("size of Data: {}", std::mem::size_of::<Data>());
}
rust memory memory-alignment
1个回答
0
投票

在结构定义附近

Data
你可以添加类似的内容

const _ACTUAL_DATA_ALIGN: usize = std::mem::align_of::<Data>();
const _EXPECTED_DATA_ALIGN: usize = 8 * std::mem::size_of::<Float>();
const _DATA_ALIGN_CHECK: () = assert!(
    _ACTUAL_DATA_ALIGN % _EXPECTED_DATA_ALIGN == 0,
    "Alignment mismatch for struct Data"
);
© www.soinside.com 2019 - 2024. All rights reserved.