小编Luc*_*que的帖子

repr(C) 在 Rust 中的零大小类型上表现如何?

我看到这篇文章解释了 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 rust

4
推荐指数
1
解决办法
178
查看次数

宏根据 int 模板值生成代码

我仍在学习 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)

c++ macros

1
推荐指数
1
解决办法
51
查看次数

标签 统计

c ×1

c++ ×1

macros ×1

rust ×1