小编Ale*_*lar的帖子

为什么生成的程序集在内联返回和内联复制之间不相等?

我有一个小结构:

pub struct Foo {
    pub a: i32,
    pub b: i32,
    pub c: i32,
}
Run Code Online (Sandbox Code Playgroud)

我在表单中使用了一对字段(a,b) (b,c) (c,a).为了避免重复代码,我创建了一个实用程序函数,它允许我迭代对:

fn get_foo_ref(&self) -> [(&i32, &i32); 3] {
    [(&self.a, &self.b), (&self.b, &self.c), (&self.c, &self.a)]
}
Run Code Online (Sandbox Code Playgroud)

我必须决定是否应该将值作为引用返回或复制i32.后来,我计划切换到非Copy类型而不是i32,所以我决定使用引用.我期望得到的代码应该是等价的,因为所有内容都将被内联.

我对优化一般都很乐观,所以我怀疑使用这个函数时代码与手写代码示例相比是等效的.

首先使用函数的变体:

pub fn testing_ref(f: Foo) -> i32 {
    let mut sum = 0;

    for i in 0..3 {
        let (l, r) = f.get_foo_ref()[i];

        sum += *l + *r;
    }

    sum
}
Run Code Online (Sandbox Code Playgroud)

然后是手写的变体:

pub fn testing_direct(f: Foo) …
Run Code Online (Sandbox Code Playgroud)

rust

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

如何相对于项目位置进行rustc-link-search?

我正在围绕C库创建一个Rust包装器。我已经将C库放在lib目录中,并build.rs用来告诉编译器在哪里找到要链接的库:

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

当我构建库时,此方法工作正常,但是依赖包装器库的下游库会出现编译失败:

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

问题似乎在于:

println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

编译客户端库时,这并不指向repository\checked_out_project\lib而是在本地查找,因为在依赖项中指定绝对路径是可行的:

println!(r"cargo:rustc-link-search=C:\users\id\.cargo\..\lib\");
Run Code Online (Sandbox Code Playgroud)

我还指示货运将lib目录包含在wrapper-lib中,如下所示:

include = ["lib/**/*"]
Run Code Online (Sandbox Code Playgroud)

如何告诉编译器相对于依赖关系,而不是正在构建的项目?我认为这应该可行:

println!(r"cargo:rustc-link-search=lib\");
Run Code Online (Sandbox Code Playgroud)

rust rust-cargo

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

标签 统计

rust ×2

rust-cargo ×1