小编Shm*_*opy的帖子

如何阻止C#用它们的值替换const变量?

我们有一个项目被编译成一个名为consts.dll的DLL,其中包含以下内容:

public static class Consts
{
    public const string a = "a";
    public const string b = "b";
    public const string c = "c";
}
Run Code Online (Sandbox Code Playgroud)

我们有多个这样的项目,每个都编译成一个同名的DLL(consts.dll),我们根据需要替换它们.我们有另一个使用这些consts的类:

public class ConstsUser 
{
    string f() { return Consts.a; }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,Consts.a优化为"a",所以即使我们替换Consts.dll实现,我们仍然得到"a"而不是正确的值,我们需要重新编译ConstsUser.反正有没有阻止优化器用它们的值替换const变量?

c# optimization

61
推荐指数
2
解决办法
3621
查看次数

如何替换dll中的类?

这个主题很模糊,因为我不确定我正在尝试做什么的正确术语.

我已经下载了一个dll(我没有源代码),并使用反射工具,我在dll实现中发现了一个错误.这个bug很容易修复.所以我们假设错误在这里:

class A 
{
    void f() { // BUG!!! }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现我自己的 A修复bug并在运行时注入它来替换其他A实例?

c# dll

46
推荐指数
2
解决办法
5089
查看次数

为什么Rust的assert_eq!使用匹配实现?

这是Rust的assert_eq!宏实现.为简洁起见,我只复制了第一个分支:

macro_rules! assert_eq {
    ($left:expr, $right:expr) => ({
        match (&$left, &$right) {
            (left_val, right_val) => {
                if !(*left_val == *right_val) {
                    panic!(r#"assertion failed: `(left == right)`
  left: `{:?}`,
 right: `{:?}`"#, left_val, right_val)
                }
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这里的目的是match什么?为什么不检查不平等?

rust

37
推荐指数
2
解决办法
5570
查看次数

为什么有LR(0)解析器而不是LL(0)解析器?

我一直在维基百科上阅读,并注意到虽然存在LR(0)解析器,但是没有LL(0)解析器这样的东西.

根据我的阅读,我理解LL(k)/ LR(k)中的k表示解析器在当前正在处理的当前字符之外可以看到多少个字符.

所以我的问题是,为什么即使LR(0)存在,也没有LL(0)解析器这样的东西?

compiler-construction parsing ll-grammar lr-grammar

14
推荐指数
1
解决办法
2万
查看次数

了解gcc -S输出

我在下面的x86_64非常复杂的程序上做了gcc -S:

int main() {
    int x = 3;
    x = 5;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而我得到的是:

       .file   "main.c"
        .text
.globl main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $3, -4(%rbp)
        movl    $5, -4(%rbp)
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
        .section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

我想知道是否有人可以帮助我理解输出或引用我的一些链接解释.具体来说,cfi ,LFB0,LFE0 , leave意味着什么?关于这些我能找到的就是这篇文章但却无法完全理解它的用途.另外,ret在这种情况下做什么?我猜它正在回归__libc_start_main(),反过来会打电话 …

assembly gcc x86-64

14
推荐指数
2
解决办法
5011
查看次数

我可以在没有底层容器的情况下使用std :: upper_bound吗?

我有一系列整数[start, end]和非递减单调函数f(i).所以从概念上讲,我有一个非递减的序列[f(start), f(start + 1), .. , f(end)].我可以std::upper_bound在该序列上使用来查找i包含范围内的第一个元素f(i) > some_value吗?

从概念上讲,我喜欢这样的事情:

std::upper_bound(start, end + 1, some_value, [&](int lhs, int rhs) { 
    return f(lhs) < f(rhs);
});
Run Code Online (Sandbox Code Playgroud)

但是这不会编译因为start并且end + 1不符合前向迭代器的要求.

c++

13
推荐指数
2
解决办法
977
查看次数

Java实现 - 元类

我理解它的方式,Java对象模型是3个级别,每个级别描述它下面的级别,因此所有类共享一个Meta类(它们本身就是对象?).

我的问题是 - 如何用Java实现构造函数?(或任何其他类方法)我的逻辑说构造函数应该出现在Meta类中,但由于只有一个Meta类,所以它保留所有可能的构造函数没有任何意义,或者我对此的理解是全部错误..

java metaclass

12
推荐指数
2
解决办法
9870
查看次数

Java泛型 - 类型推导

考虑以下:

 public class GenericTest {
    static void print(int x) {
        System.out.println("Int: " + x);
    }
    static void print(String x) {
        System.out.println("String: " + x);
    }

    static void print(Object x) {
        System.out.println("Object: " + x);
    }

    static <T> void printWithClass(T t) {
        print(t);
    }
    public static void main(String argsp[]) {
        printWithClass("abc");
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印Object:abc.为什么不打印字符串:abc?

java generics

11
推荐指数
2
解决办法
975
查看次数

虚拟机

我一直试图弄清楚VMware是如何工作的(特别是安装Linux时),我有几个问题:

  1. VMware遇到类似命令时会发生什么push cs?特别是cs,因为它的权限级别为0,VMware运行在1个权限级别,所以我假设它不得不将其转换为其他命令.

  2. 虚拟内存:它如何在虚拟机上运行?有2级翻译 - 进程虚拟内存 - >虚拟机物理内存 - >真机物理内存?当真实机器交换页面时,如何通知VMware?

virtualization vmware virtual-memory

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

用C实现产量

例如:

int getNext(int n) {
    while (TRUE) {
        n = n+1;
        yield n;
    }
}

int main() {
    while (TRUE) {
        int n = getNext(1);
        if (n > 42)
           break;
        printf("%d\n",n);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样上面的代码就会打印出1到42之间的所有数字.我想把yieldgetNext的地址改成后面的指令yield.但我无法弄清楚如何保存上下文(寄存器/变量),因为堆栈将由调用函数运行.

注意:

我意识到上面的代码可以通过静态变量轻松实现,但这不是重点.

c yield

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