小编qin*_*oon的帖子

是否需要仅增量计数器的同步?

我使用整数作为计数器.整数只会增加,肯定会有多个线程同时增加它.在没有其他线程尝试访问其值时,在程序执行结束时读取此计数器的值.

我假设我不必为这种仅增量计数器使用锁或任何类型的同步.这是正确的吗?如果这有任何区别,我用Java编写代码.

java counter synchronization increment

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

如何创建Rust宏以使用其自己的标识符值定义String变量?

我想写一个宏来定义如下的内容:

let FOO: String = "FOO".to_string();
Run Code Online (Sandbox Code Playgroud)

我有可能有一个宏:

macro_rules! my_macro {
    ($name: ident, $val: expr) => {
        let $name: String = $val.to_string();
    }
}
Run Code Online (Sandbox Code Playgroud)

并用它作为 my_macro!(FOO, "FOO");

但是,这有点多余.我希望有类似的东西my_macro!(FOO),它可以扩展并使用$nameas标识符,但也可以在字符串值中.

macros rust

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

由javac完成的任何类型的转换?

根据我的理解,如果在编译期间可以进行类型检查,则类型转换将在编译期间完成,并且不会产生任何运行时开销.

例如

public Child getChild() {
  Parent o = new Child();
  return (Child) o;
}
Run Code Online (Sandbox Code Playgroud)

类型转换是在编译期间还是在运行时完成的?

是否有任何一般规则来决定是否由javac编译器或VM完成类型转换?

java casting javac

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

美元符号在Java方法描述符中的含义?

例如,它是Jikes RVM堆栈的一部分.

at [0x70cfba90, 0x708cfaa4] Lorg/apache/lucene/index/SegmentInfos; 
       **access$000**(Ljava/lang/String;)V
at [0x70cfbb04, 0x708b55c8] Lorg/apache/lucene/index/SegmentInfos$
       FindSegmentsFile; run()Ljava/lang/Object; at line 554
at [0x70cfbb24, 0x708c4a8d] Lorg/apache/lucene/index/SegmentInfos; 
       read(Lorg/apache/lucene/store/Directory;)V at line 272
Run Code Online (Sandbox Code Playgroud)

'access'应该是方法名称.但我检查了类源代码及其接口,没有任何方法称为"访问".我无法在Google上找到答案,因为Google讨厌各种标点符号.有人可以帮忙吗?非常感谢.

java descriptor dollar-sign

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

多个冒号和makefile中的等号(需要说明)

这只是一个makefile的一部分.我不太明白发生了什么.

OBJS = $(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o)
$(OBJS):$(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)
Run Code Online (Sandbox Code Playgroud)

我理解的是这些行在'print-opts'之后用'cc-command'将.cpp文件编译成.o文件.但我不懂语义.

如果我展开'OBJS'的宏,这一行应该是:

$(SRCS:$(SRC)/%.cpp=$(OBJ)/%.o) : $(OBJ)/%.o: $(SRC)/%.cpp | print-opts
    $(cc-command)
Run Code Online (Sandbox Code Playgroud)

对我来说,它看起来像'$(SRCS:$(SRC)/%.cpp = $(OBJ)/%.o)',它声称$(SRC)中的所有.cpp将以$($)来兑换. OBJ),但这取决于$(OBJ)/%.o,这取决于$(SRC)/%.cpp.这没有意义......

我不明白这里等号的意思是什么,以及多个冒号是什么意思.

makefile

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

antlr4:如何知道在给定上下文的情况下选择哪个替代方案

假设有一个关于'类型'的规则.它是预定义类型(由IDENTIFIER引用)或typeDescriptor.

type
:   IDENTIFIER
|   typeDescriptor
;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我有一个typeContext'ctx'的实例.我如何知道是否选择了路径IDENTIFIER,或者是否选择了typeDescriptor.

我认识到一种方法是测试ctx.IDENTIFIER() == nullctx.typeDescriptor() == null.但是,当有更多的选择时,似乎效果不佳.有没有办法返回索引来指示选择哪个规则?谢谢.

antlr antlr4

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

如何将不相交的切片从向量传递到不同的线程?

我是Rust的新手,并努力处理Rust中的所有包装器类型.我试图编写在语义上等于以下C代码的代码.代码尝试创建一个用于簿记的大表,但是会分割大表,以便每个线程只访问该表的本地小片.除非其他线程退出并且不再访问自己的切片,否则不会访问大表.

#include <stdio.h>
#include <pthread.h>

void* write_slice(void* arg) {
    int* slice = (int*) arg;
    int i;
    for (i = 0; i < 10; i++)
        slice[i] = i;

    return NULL;
}

int main()
{
    int* table = (int*) malloc(100 * sizeof(int));
    int* slice[10];
    int i;
    for (i = 0; i < 10; i++) {
      slice[i] = table + i * 10;
    }

    // create pthread for each slice
    pthread_t p[10];
    for (i = 0; i < 10; i++)
        pthread_create(&p[i], NULL, write_slice, …
Run Code Online (Sandbox Code Playgroud)

rust

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

将c/c ++与Java本机代码集成为共享库(由gcj编译)

gcj可以将Java代码编译为本机代码.我感兴趣的是如果将Java编译成共享库,我们如何在c/c ++程序中使用库中的方法.

我没有成功.以下是我的尝试:

Java代码(将编译成共享库):

// JavaLib.java
public class JavaLib {
  public static void hello() {
    System.out.println("Hello, in Java Lib");
  }
}
Run Code Online (Sandbox Code Playgroud)

编译:

$gcj -C JavaLib.java
$gcj -fPIC -c JavaLib.class
$gcj -shared -o libJavaLib.so JavaLib.o -lstdc++
Run Code Online (Sandbox Code Playgroud)

生成标题:

$gcjh -cp=. JavaLib
Run Code Online (Sandbox Code Playgroud)

c ++中的库用户:

#include <stdio.h>
#include <dlfcn.h>
#include "JavaLib.h"
using namespace std;
int main(int argc, char **argv) {
  void * handle = dlopen("./libJavaLib.so", RTLD_LAZY);
  char * error;

  if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
  }

  void (*hello)();
  hello = (void (*)())dlsym(handle, "JavaLib::hello");

  if …
Run Code Online (Sandbox Code Playgroud)

c java gcj shared-libraries

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

如何从 Box&lt;dyn T&gt; 获取 &amp;dyn T

&dyn T我正在尝试从 a获取a Box<dyn T>,如以下示例所示。但是,它无法编译。

trait MyTrait {
    
}

struct Foo;
impl MyTrait for Foo {}

fn main() {
    let b: Box<dyn MyTrait> = Box::new(Foo);
    let c: &dyn MyTrait = &b;
}
Run Code Online (Sandbox Code Playgroud)

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=69c72904fbceae5b55470a878a441b7d

错误信息是

error[E0277]: the trait bound `Box<dyn MyTrait>: MyTrait` is not satisfied
  --> src/main.rs:10:27
   |
10 |     let c: &dyn MyTrait = &b;
   |                           ^^ the trait `MyTrait` is not implemented for `Box<dyn MyTrait>`
   |
   = note: required for the cast to the object …
Run Code Online (Sandbox Code Playgroud)

rust

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

C struct是盒装类型时,C struct是unboxed吗?

正如许多书中所提到的,与C++结构和类的区别在于访问控制描述符.因此,我想知道以下陈述是否正确:

C中的struct是unboxed:struct中的成员明显位于分配struct的位置.但是C++中的struct是类似盒子的类型:members/headers位于其他地方,并且分配struct的地方包含指向members/headers的指针.

这种理解对吗?

是否可以在C++中创建一个未装箱的类型,它还包含实例方法?

c c++ struct

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

当我的编译器以 C 为目标时如何提供源级调试信息

我正在开发一个将源语言翻译成 C 的编译器。然后任何 C 编译器都可以将它编译成可执行的二进制文件。

尽管 C 编译器可以将自己的调试信息附加到可执行文件中,但是,这些都是 C 级信息。例如,堆栈跟踪显示 C 中的 C 函数和行号,而不是源代码函数和行号。

我非常关心以下可供用户使用的调试信息:

  1. 源级函数/行/文件名等的堆栈跟踪。
  2. 要打印为源级值的变量值

当编译器以 C 为目标时,对此的常用方法是什么?

我在看 GDB 漂亮的打印机。这对我来说是一个可能的解决方案吗?

c compiler-construction gdb

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