小编jac*_*bsa的帖子

Golang:如何在不重新编译的情况下反复运行"go test"?

有没有办法让我轻松地多次运行Go测试,第一次失败时停止?我当然可以这样做:

for i in {1..1000}; do go test ./mypkg && done
Run Code Online (Sandbox Code Playgroud)

但这会导致每次重新编译,与测试本身相比非常慢.我想我可以通过一些巧妙的-exec 旗帜应用来做到这一点xargs,但我不擅长单线.

如果它在一千次中失败一两次,那么与一些相似的清晰详细输出并行地多次运行它的加分点.

xargs go

8
推荐指数
2
解决办法
2324
查看次数

x86-64上的C++:何时传递结构/类并在寄存器中返回?

假设Linux上的x86-64 ABI,在C++中的什么条件下结构传递给寄存器中的函数而不是堆栈中的函数?他们在什么条件下返回登记册?课程的答案是否会改变?

如果它有助于简化答案,则可以假设单个参数/返回值而没有浮点值.

c++ assembly x86-64 abi

8
推荐指数
2
解决办法
1013
查看次数

是否有可能故意击败特定类型的有保证的复制省略?

在 C++17 及更高版本中,有保证的复制省略意味着可以从一系列函数返回不可移动的对象,一直到最终调用者:

struct NonMoveable {
  NonMoveable() = default;
  NonMoveable(NonMoveable&&) = delete;
};

NonMoveable Foo() { return NonMoveable(); }
NonMoveable Bar() { return Foo(); }
NonMoveable Baz() { return Bar(); }

NonMoveable non_moveable = Baz();
Run Code Online (Sandbox Code Playgroud)

是否有一些技巧可以禁用特定类型的保证复制省略,以便不可能编写类似BarBaz以上的函数来传递NonMoveable从另一个函数获得的对象?(我不知道是否Foo应该被禁止。)


我知道这是一个奇怪的要求。如果您对我想做的事情感兴趣:我正在开发一个协程库,其中的约定是,如果您Task从函数返回 a,则该函数的所有引用参数都需要保持有效,直到任务已准备就绪,即直到co_await任务的表达式求值为止。如果从另一个协程调用一个协程,这一切都完全可以正常工作,因为我已经安排该Task类型不可移动并按值接受:除了立即使用它以及您提供的任何临时对象之外,您无法对它执行任何操作co_await对子协程的调用将一直存在,直到co_await表达式求值为止。

除了你还可以用 做另一件事Task:编写像Bar上面Baz这样的函数return Foo()来代替co_return co_await Foo()。如果存在争议,Foo这可能是暂时的,在这种情况下,这样做是安全的,co_return …

c++ copy-elision c++17 c++20

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

什么是处理或记住GNU汇编程序中cmp的后向参数的好方法?

以下是Intel语法中的一些汇编代码:

// Jump to done if rsi >= rax.
cmp rsi, rax
jae done
Run Code Online (Sandbox Code Playgroud)

这对我的大脑有意义:如果rsi"高于或等于"rax,则跳转,匹配指令中参数的顺序cmp.将其与GNU语法进行比较:

// Jump to done if rsi >= rax.
cmp %rax, %rsi
jae done
Run Code Online (Sandbox Code Playgroud)

这每次伤害我的大脑.它没有帮助,当我来到这个新的后一段时间不写汇编代码我去看看的语义cmp ,并jae在Intel手册,发现这一切都在"第一","第二"操作,来表述其与我面前在屏幕上看到的不符.

结束抱怨.我的问题:

  1. 有没有其他方式表达cmpjaeGNU汇编程序,以便操作数的顺序cmp与逻辑比较匹配jae

  2. 假设(1)的答案是否定的,是否有人有一个很好的方式让我看看这个,以便我能记住下次它是如何工作的?还有比"GNU倒退"更好的东西吗?

请注意,我不是要问如何在GNU汇编程序中使用Intel语法; 我知道这是可能的.我正在使用现有的GNU语法代码库,并且正在寻求一些助记符或其他方式来帮助我保持这一点.

x86 assembly gnu gnu-assembler

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

在std :: shared_ptr删除程序运行时,弱指针是否保证已过期?

如果我有一个std::shared_ptr<Foo>自定义删除器,是否保证所有相关的弱指针被删除器视为已过期?(如果你能引用标准中的相关章节,我将非常感激.)

换句话说,下面的断言保证不会触发?

std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
  new Foo,
  [&weak] (Foo* f) {
    assert(weak.expired());
    delete f;
  },
};

weak = strong;
strong.reset();
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11 c++14

7
推荐指数
2
解决办法
475
查看次数

如何判断我是否正在转发到复制构造函数?

如果我正在编写一个将参数转发给构造函数的通用函数,有没有办法判断它是否是一个复制构造函数?基本上我想做:

template <typename T, typename... Args>
void CreateTAndDoSomething(Args&&... args) {
  // Special case: if this is copy construction, do something different.
  if constexpr (...) { ... }

  // Otherwise do something else.
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想出的最好的方法是检查sizeof...(args) == 1然后查看std::is_same_v<Args..., const T&> || std::is_same_v<Args..., T&>. 但我认为这错过了边缘情况,例如 volatile 限定的输入和隐式转换为T.

老实说,我不完全确定这个问题是明确定义的,所以请随时告诉我它不是(以及为什么)。如果它有帮助,您可以假设唯一的单参数构造函数TT(const T&)and T(T&&)

如果我认为这没有明确定义是对的,因为复制构造函数不是事物,那么也许可以通过说“我如何判断表达式是否T(std::forward<Args>(args)...)选择接受的重载const T&

c++ templates

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

C++ 模板模板参数可以接受采用非类型参数的模板吗?

我有一个这样的函数要fmap为 C++ 实现:

// Given a mapping F from T to U and a container of T, return a container of U
// whose elements are created by the mapping from the original container's
// elements.
template <typename F, template <typename...> typename Container, typename T>
Container<std::invoke_result_t<F&, const T&>> Fmap(F&& f,
                                                   const Container<T>& input);
Run Code Online (Sandbox Code Playgroud)

这个想法是使用模板模板参数 ( Container) 来允许接受任何类似 STL 的容器。我尝试过的实际 STL 中的所有内容都工作正常,但我们的代码库中的自定义容器不起作用,因为它接受非类型模板参数

template <typename Key, int Foo = 256>
class MyContainer;
Run Code Online (Sandbox Code Playgroud)

这会导致 clang 替换失败:

template template argument has …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-templates c++17 c++20

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

有赠品和无赠品的vmsplice(2)的语义是什么?

我试图了解vmsplice(2)syscall 的功能(此处的手册页)。关于SPLICE_F_GIFT标志的作用,我有两个问题:

  1. 手册页指出,一旦将页面赠予内核,就不能再修改内存。这是否意味着该内存将永远固定,还是可能指的是赠礼过程无法映射的虚拟内存,而不是物理内存?换句话说,这种用法的典型用法是什么样的?

  2. 如果我不设置SPLICE_F_GIFTvmsplice(2)与矢量化写syscall 有什么不同writev(2)吗?

linux linux-kernel splice zero-copy

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

clang-format:如何防止下一行的所有函数参数?

我有一个C++函数调用,我手动和故意格式化如下:

DoSomethingForAPurposeThatCausesALongFunctionName(
    arg_0,
    arg_1,
    arg_2);
Run Code Online (Sandbox Code Playgroud)

clang-format想要像这样重新格式化:

DoSomethingForAPurposeThatCausesALongFunctionName(
    arg_0, arg_1, arg_2)
Run Code Online (Sandbox Code Playgroud)

我不想要这个.AllowAllParametersOfDeclarationOnNextLine似乎控制了函数声明的这种行为,但是函数调用呢?有相应的设置吗?

.clang-format看起来像这样:

BasedOnStyle: Google
BinPackArguments: false
BinPackParameters: false
AllowAllParametersOfDeclarationOnNextLine: false
AlignAfterOpenBracket: AlwaysBreak
Run Code Online (Sandbox Code Playgroud)

c++ clang-format

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

C++:std :: unordered_map是否保证基于节点?

什么是典型的布局std::unordered_map<K, V>?是KV对象存储在桶本身,还是做桶存储指向包含密钥和值的节点?

我试图弄清楚使用std::unordered_map<K, V>对比的性能影响std::unordered_map<K, V*>.假设我只是设置和查找值,有没有理由更喜欢后者,即使值非常大?我能想象的唯一原因是,这些值是否存储在桶中,并且每次重新处理容器时都需要重新分配.

标准中有什么可以保证不会发生这种情况吗?

c++ unordered-map c++11

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