有没有办法让我轻松地多次运行Go测试,第一次失败时停止?我当然可以这样做:
for i in {1..1000}; do go test ./mypkg && done
Run Code Online (Sandbox Code Playgroud)
但这会导致每次重新编译,与测试本身相比非常慢.我想我可以通过一些巧妙的-exec
旗帜应用来做到这一点xargs,但我不擅长单线.
如果它在一千次中失败一两次,那么与一些相似的清晰详细输出并行地多次运行它的加分点.
假设Linux上的x86-64 ABI,在C++中的什么条件下结构传递给寄存器中的函数而不是堆栈中的函数?他们在什么条件下返回登记册?课程的答案是否会改变?
如果它有助于简化答案,则可以假设单个参数/返回值而没有浮点值.
在 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)
是否有一些技巧可以禁用特定类型的保证复制省略,以便不可能编写类似Bar及Baz以上的函数来传递NonMoveable从另一个函数获得的对象?(我不知道是否Foo应该被禁止。)
我知道这是一个奇怪的要求。如果您对我想做的事情感兴趣:我正在开发一个协程库,其中的约定是,如果您Task从函数返回 a,则该函数的所有引用参数都需要保持有效,直到任务已准备就绪,即直到co_await任务的表达式求值为止。如果从另一个协程调用一个协程,这一切都完全可以正常工作,因为我已经安排该Task类型不可移动并按值接受:除了立即使用它以及您提供的任何临时对象之外,您无法对它执行任何操作co_await对子协程的调用将一直存在,直到co_await表达式求值为止。
除了你还可以用 做另一件事Task:编写像Bar上面Baz这样的函数return Foo()来代替co_return co_await Foo()。如果存在争议,Foo这可能是暂时的,在这种情况下,这样做是安全的,co_return …
以下是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手册,发现这一切都在"第一","第二"操作,来表述其与我面前在屏幕上看到的不符.
结束抱怨.我的问题:
有没有其他方式表达cmp或jaeGNU汇编程序,以便操作数的顺序cmp与逻辑比较匹配jae?
假设(1)的答案是否定的,是否有人有一个很好的方式让我看看这个,以便我能记住下次它是如何工作的?还有比"GNU倒退"更好的东西吗?
请注意,我不是要问如何在GNU汇编程序中使用Intel语法; 我知道这是可能的.我正在使用现有的GNU语法代码库,并且正在寻求一些助记符或其他方式来帮助我保持这一点.
如果我有一个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) 如果我正在编写一个将参数转发给构造函数的通用函数,有没有办法判断它是否是一个复制构造函数?基本上我想做:
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.
老实说,我不完全确定这个问题是明确定义的,所以请随时告诉我它不是(以及为什么)。如果它有帮助,您可以假设唯一的单参数构造函数T是T(const T&)and T(T&&)。
如果我认为这没有明确定义是对的,因为复制构造函数不是事物,那么也许可以通过说“我如何判断表达式是否T(std::forward<Args>(args)...)选择接受的重载const T&?
我有一个这样的函数要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) 我试图了解vmsplice(2)syscall 的功能(此处的手册页)。关于SPLICE_F_GIFT标志的作用,我有两个问题:
手册页指出,一旦将页面赠予内核,就不能再修改内存。这是否意味着该内存将永远固定,还是可能指的是赠礼过程无法映射的虚拟内存,而不是物理内存?换句话说,这种用法的典型用法是什么样的?
如果我不设置SPLICE_F_GIFT,vmsplice(2)与矢量化写syscall 有什么不同writev(2)吗?
我有一个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) 什么是典型的布局std::unordered_map<K, V>?是K与V对象存储在桶本身,还是做桶存储指向包含密钥和值的节点?
我试图弄清楚使用std::unordered_map<K, V>对比的性能影响std::unordered_map<K, V*>.假设我只是设置和查找值,有没有理由更喜欢后者,即使值非常大?我能想象的唯一原因是,这些值是否存储在桶中,并且每次重新处理容器时都需要重新分配.
标准中有什么可以保证不会发生这种情况吗?
c++ ×7
assembly ×2
c++11 ×2
c++17 ×2
c++20 ×2
templates ×2
abi ×1
c++14 ×1
clang-format ×1
copy-elision ×1
gnu ×1
go ×1
linux ×1
linux-kernel ×1
shared-ptr ×1
splice ×1
x86 ×1
x86-64 ×1
xargs ×1
zero-copy ×1