我看到这篇文章解释了 C 中的结构体大小不能为零,并且必须至少有一个命名字段才不会出现未定义的行为。然而,在 Rust 中,我们可以拥有这样的结构。我们还可以#[repr(C)]从文档中将结构标记为“做 C 所做的事情”。
所以很自然地,我去操场尝试这个:
#[repr(C)]
struct ZeroSized;
fn main() {
println!("Size: {}", std::mem::size_of::<ZeroSized>());
}
Run Code Online (Sandbox Code Playgroud)
这段代码确实打印出了 0。
我想知道#[repr(C)]如果在 C 中禁止使用零大小的结构,Rust 是否允许它们,甚至是 UB?这样一个结构体的最终大小实际上会是 0 吗?如果我在内存中复制这个结构会发生什么?我什至可以有一个指向它的指针吗?
我仍在学习 C++,并为其编写粒子模拟库。我想尽可能优化我的工作代码,我的下一个瓶颈是我的向量运算符。
我创建了一个模板向量类,该类取决于向量中包含的类型和维度:
template<typename T, unsigned int D>
class Vector {
private:
T values[D];
}
Run Code Online (Sandbox Code Playgroud)
然后我的运算符定义如下:
template<typename T, unsigned int D>
Vector<T, D> operator+(const Vector<T, D>& v1, const Vector<T, D>& v2) {
T values [D];
for(unsigned int i = 0; i < D; i++) {
values[i] = v1[i] + v2[i];
}
return Vector<T, D>(values);
}
Run Code Online (Sandbox Code Playgroud)
在我的模拟中,我最终进行了大量的矢量计算,我想尝试优化它。
我的第一个假设是,如果我提前知道尺寸,我可以摆脱循环并得到类似的东西:
T values[3];
values[0] = v1[0] + v2[0];
values[1] = v1[1] + v2[1];
values[2] = v1[2] + v2[2];
return Vector<T, 3>(values);
Run Code Online (Sandbox Code Playgroud)
所以我想到了一个递归宏,如下所示:
#define vec_sum(D, …Run Code Online (Sandbox Code Playgroud)