小编hid*_*atz的帖子

在没有插件的情况下在 vim 上运行 gofmt

我想在 vim 上保存时运行 gofmt 而不安装任何插件。这是我尝试过的(灵感来自https://gist.github.com/tbrisbout/a91ac3419440cde40c5f54dc32c94427):

function! GoFmt()
  let file = expand('%')
  silent execute "!gofmt -w " . file
  edit!
endfunction

command! GoFmt call GoFmt()
augroup go_autocmd
  autocmd BufWritePost *.go GoFmt
augroup END
Run Code Online (Sandbox Code Playgroud)

这仅在没有格式错误时有效。但是,如果代码包含错误,它会在屏幕底部显示错误消息,并且(看起来)它以文本形式出现在缓冲区上,因此整个代码都会被破坏。有没有一种简单的方法可以在 vim 上处理此类工作?

vim go gofmt

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

CPU乱序执行和内存顺序有什么关系?

在我的理解中,CPU为了优化而改变了写在机器代码上的操作顺序,这被称为乱序执行。

在术语“内存顺序”中,它定义了访问内存的顺序。例如,在宽松的顺序中,它定义了非常弱的排序规则,并且很容易发生执行重排序。
x86 中有一些内存排序模型,例如 TSO。在这样的存储器排序模型中,定义了处理器的存储器访问顺序的语义。

我不明白的是他们之间的关系。内存顺序是一种乱序执行吗?OoOe还有其他方法吗?
或者说,内存顺序乱序执行的实现,处理器的所有重新排序都是基于语义的吗?

memory cpu cpu-architecture memory-barriers

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

riscv objdump -d 的输出不清楚

现在我正在尝试了解 RISC-V ISA,但我对机器代码和汇编有不清楚的地方。

我写了这样的C代码:

int main() {
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

然后,我通过以下命令生成了 .s 文件:

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -S 42.c

输出是:

        .file   "42.c"
        .option nopic
        .text
        .align  1
        .globl  main
        .type   main, @function
main:
        addi    sp,sp,-16
        sd      s0,8(sp)
        addi    s0,sp,16
        li      a5,42
        mv      a0,a5
        ld      s0,8(sp)
        addi    sp,sp,16
        jr      ra
        .size   main, .-main
        .ident  "GCC: (g5964b5cd727) 11.1.0"
        .section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

现在,我运行以下命令来生成一个精灵。

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -nostdlib -o 42 42.s

这样,就生成了一个二进制文件。我尝试通过 objdump 读取该内容,如下所示:

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-objdump -d 42

所以输出是这样的:


42:     file format elf64-littleriscv


Disassembly of section .text:

00000000000100b0 …
Run Code Online (Sandbox Code Playgroud)

linux assembly elf objdump riscv

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

进行整数数据竞争

关于 int 类型上 Go 数据竞争的问题。当我运行下面的程序时go run -race main.go

package main

import "fmt"

var i int

func main() {

    go func() {
        i = 10
    }()

    i = 5

    fmt.Println(i)
}
Run Code Online (Sandbox Code Playgroud)

它显示数据竞争警告。

~  $ go run -race main.go
5
==================
WARNING: DATA RACE
Write at 0x000000605908 by goroutine 7:
  main.main.func1()
      /home/dty1er/main.go:80 +0x3a

Previous write at 0x000000605908 by main goroutine:
  main.main()
      /home/dty1er/main.go:83 +0x56

Goroutine 7 (running) created at:
  main.main()
      /home/dty1er/main.go:79 +0x46
==================
Found 1 data race(s)
exit status 66
Run Code Online (Sandbox Code Playgroud)

我知道为什么会发生这种数据竞争; …

concurrency go goroutine

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