我在编译器资源管理器中摆弄,我发现传递给 std::min 的参数顺序改变了发出的程序集。
这是 Godbolt Compiler Explorer 上的示例
double std_min_xy(double x, double y) {
return std::min(x, y);
}
double std_min_yx(double x, double y) {
return std::min(y, x);
}
Run Code Online (Sandbox Code Playgroud)
这被编译(例如,在 clang 9.0.0 上使用 -O3):
std_min_xy(double, double): # @std_min_xy(double, double)
minsd xmm1, xmm0
movapd xmm0, xmm1
ret
std_min_yx(double, double): # @std_min_yx(double, double)
minsd xmm0, xmm1
ret
Run Code Online (Sandbox Code Playgroud)
如果我将 std::min 更改为老式三元运算符,这种情况仍然存在。它也适用于我尝试过的所有现代编译器(clang、gcc、icc)。
底层指令是minsd. 阅读文档,第一个参数minsd也是答案的目的地。显然 xmm0 是我的函数应该放置其返回值的地方,所以如果 xmm0 用作第一个参数,则movapd不需要。但是如果 xmm0 是第二个参数,那么它必须movapd xmm0, xmm1将值放入 xmm0。(编者注:是的,x86-64 System V在 …
使用git v1.7.1我正在尝试同时使用--preserve-merges和--onto功能进行rebase .最终结果似乎没有合并提交,因此看起来是线性的.我宁愿保留合并提交,原因与人们经常使用的相同--preserve-merges(更容易看到逻辑上属于单独功能并在其自己的分支中开发的提交组).
我的主分支(rebase的目的地)很无聊:
A-B-C
我想要的功能分支有一个已合并到其中的子功能分支.喜欢:
X - Y
/ \
V-W ------ Z
Run Code Online (Sandbox Code Playgroud)
其中Z是合并提交,它是要从中获取的要素分支的头部,并且X和Y位于子要素分支上.
我正在使用: git rebase --preserve-merges --onto C V Z
我想最终得到:
X - Y
/ \
A-B-C-W ------ Z
Run Code Online (Sandbox Code Playgroud)
但相反,我得到:
A-B-C-W-X-Y
Run Code Online (Sandbox Code Playgroud)
由于Z是一个无冲突的合并,代码的最终状态是正确的,但历史并不像我想的那样具有表现力.
有没有办法得到我想要的东西?
编辑地址@Bombe:我写了一个bash脚本来构建我的例子.在我的系统(RHEL 6.2 with git 1.7.1)上,这证明了我的问题.
#! /bin/bash
# start a new empty repo
git init
# make some commits on the master branch
git checkout master
touch A.txt; git add A.txt; git commit -m "add A.txt"; git …Run Code Online (Sandbox Code Playgroud) 我试图以某种方式使用 git,使项目中的某些子目录对“不受信任”的用户保密/隐藏,但对其他“受信任”的用户可见。请注意,这不仅仅是写保护;它还包括写保护。不可信的用户也不能读取秘密文件。我希望用户体验就像是单个 git 存储库,而不是子模块之类的东西。
我会告诉你到目前为止我唯一的想法,以防引发一些讨论或批评。我正在考虑在服务器的后台有两个并行的存储库。受信任的用户克隆/拉取/推送受信任的存储库。不受信任的用户克隆/拉取/推送不受信任的存储库。当对受信任的存储库进行提交时,会先对其进行过滤以删除秘密内容,然后再将其应用于不受信任的存储库。另一方面,对不受信任的存储库的提交会被过滤,以避免在应用于受信任的存储库之前破坏秘密内容。
我应该如何实现这个目标?我提出的解决方案疯狂吗?
有没有办法获取 Jamroot 文件的位置,以用作项目中另一个 Jamfile 中的常量?
现在,我的 Jamroot 里有这样的东西:
constant HOME : [ os.environ HOME ] ;
constant MYPROJECT_ROOT : $(HOME)/src/myproject ;
Run Code Online (Sandbox Code Playgroud)
然后我可能会在另一个 Jamfile 中执行类似的操作,以允许我包含带有来自项目根目录的路径的标头。
<include>$(MYPROJECT_ROOT)
Run Code Online (Sandbox Code Playgroud)
这尤其令人不满意,因为这意味着如果我与其他人共享此项目,他们必须将其保留在与其相对的完全相同的位置$HOME,否则他们必须更新 Jamroot。
我对执行此特定包含的智能方法感兴趣(而不是我无知的使用常量的初学者方法)。但我也有兴趣按照我要求的方式解决问题 - 通过将 Jamroot 位置设置为常量 - 因为这在其他方面也可能有用。