我有一个结构体
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>());
}
在结构定义附近
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"
);