我遇到的大多数系统都有tempfile(1)和mktemp(1).有语法差异,也mktemp可以创建目录,但它们似乎也做同样的事情.
这两者有什么区别吗?为什么两者都存在?比另一个更标准吗?如果我只想安全地创建一个临时文件,是否有理由更喜欢一个而不是另一个?
我怀疑这背后有一些有趣的Unix知识,但我的搜索没有任何结果.
早在九十年代,微软推出了Windows注册表.应用程序可以将设置存储在不同的配置 有适用于应用程序范围和用户特定范围的配置单元,这些范围放置在适当的位置,以便漫游配置文件正常工作.
在.NET 2.0及更高版本中,我们有一个名为Application Settings的东西.应用程序可以使用它们来存储XML文件,app .exe.config和user .config中的设置.这些适用于应用程序范围和用户特定的范围,并且这些范围放置在适当的位置,以便漫游配置文件正常工作.
听起来有点熟?这些应用程序设置由XML文件支持的原因是什么,而不是简单地使用注册表?这不是注册表的目的吗?
我能想到的唯一原因是注册表是特定于Windows的,而.NET试图与平台无关.这是一个(或那个)原因,还是有其他我忽视的考虑因素?
在OpenGL中,人们经常编写如下代码:
glPushMatrix();
// modify the current matrix and use it
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
本质上,状态已更改,然后执行一些使用新状态的操作,最后恢复状态.
现在这里有两个问题:
在真正的基于对象的编程风格中,我编写了一些实用程序类来克服这些问题,如下所示:
struct WithPushedMatrix {
WithPushedMatrix() { glPushMatrix(); }
~WithPushedMatrix() { glPopMatrix(); }
};
Run Code Online (Sandbox Code Playgroud)
现在我可以简单地写下我之前的例子:
WithPushedMatrix p;
// modify the current matrix and use it
Run Code Online (Sandbox Code Playgroud)
恢复的确切时刻取决于生命周期p.如果抛出异常,则会p调用析构函数,恢复状态,并且生命是好的.
不过,我并不完全开心.特别是如果构造函数接受一些参数(例如flags glEnable),很容易忘记将对象赋值给变量:
WithEnabledFlags(GL_BLEND); // whoops!
Run Code Online (Sandbox Code Playgroud)
临时性立即被破坏,状态变化过早地被逆转.
另一个问题是,阅读我的代码的其他人可能会感到困惑:"为什么这里声明的变量从未被使用?让我们摆脱它!"
所以,我的问题:这是一个好模式吗?它甚至可能有名字吗?我忽略了这种方法有什么问题吗?最后但并非最不重要的:有什么好的选择吗?
更新:是的,我想这是RAII的一种形式.但不是通常使用RAII的方式,因为它涉及一个看似无用的变量; 永远不会明确访问有问题的"资源".我只是没有意识到这种特殊用法是如此常见.
我想开始在我的项目网站上使用GitHub Pages.这只需要gh-pages在repo中命名的分支(子树),并提供其内容.问题是网站的一部分(手动,更改日志,下载页面......)是由构建系统自动生成的,所以我想找到gh-pages在主要仓库保持打开时将这些更改提交到分支的最佳方法master(或任何地方).
为了提交gh-pages分支,我可以编写一个脚本,将repo克隆到一个临时目录中,进行修改,提交它们,然后将它们推回到主repo.但这听起来像一个容易出错的过程,所以我希望有一个更简单的方法.
一位朋友建议我可以将gh-pages分支作为子模块添加到主存储库中.我做了一个小实验,但它不太有效:
$ git init main
Initialized empty Git repository in /tmp/main/.git/
$ cd main
$ touch main.txt
$ git add .
$ git commit -m'Initial commit in main branch.'
[master (root-commit) 1c52a4e] Initial commit in main branch.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 main.txt
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
Removing main.txt
$ touch index.html …Run Code Online (Sandbox Code Playgroud) 我想要的是这个问题.但是,我希望拆分为单独仓库的目录仍然是该仓库中的子目录:
我有这个:
foo/
.git/
bar/
baz/
qux/
Run Code Online (Sandbox Code Playgroud)
我想将它拆分为两个完全独立的存储库:
foo/
.git/
bar/
baz/
quux/
.git/
qux/ # Note: still a subdirectory
Run Code Online (Sandbox Code Playgroud)
如何在git中执行此操作?
如果有一些方法可以将所有新repo的内容移动到历史记录中的子目录中,我可以使用此答案中的方法.
我现在正在参加一个装配课程,那个检查我们家庭作业的人是一个非常迂腐的老派优化狂.例如,如果他看到,他会扣除10%:
mov ax, 0
Run Code Online (Sandbox Code Playgroud)
代替:
xor ax,ax
Run Code Online (Sandbox Code Playgroud)
即使它只使用一次.
我不是一个完整的汇编程序初学者,但我不是一个优化专家,所以我需要你的帮助(可能是一个非常愚蠢的问题,但无论如何我都会问):如果我需要将寄存器值设置为1或(-1)最好使用:
mov ax, 1
Run Code Online (Sandbox Code Playgroud)
或做类似的事情:
xor ax,ax
inc ax
Run Code Online (Sandbox Code Playgroud)
我真的需要一个好成绩,所以我试图让它尽可能优化.(我需要优化时间和代码大小)
例如,这就是我写它的方式,它编译并且工作得很好:
template<typename T> struct is_pointer<T*> {
static const bool value = true;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么有些人写的不太明显
template<typename T> struct is_pointer<T*> {
enum { value = true };
}
Run Code Online (Sandbox Code Playgroud)
代替?是不是因为static const变量使用了一个字节的内存,而enum不是?
我正在使用Gauss-Seidel方法编写稀疏矩阵求解器.通过剖析,我已经确定我的程序的大约一半时间花在解算器中.性能关键部分如下:
size_t ic = d_ny + 1, iw = d_ny, ie = d_ny + 2, is = 1, in = 2 * d_ny + 1;
for (size_t y = 1; y < d_ny - 1; ++y) {
for (size_t x = 1; x < d_nx - 1; ++x) {
d_x[ic] = d_b[ic]
- d_w[ic] * d_x[iw] - d_e[ic] * d_x[ie]
- d_s[ic] * d_x[is] - d_n[ic] * d_x[in];
++ic; ++iw; ++ie; ++is; ++in;
}
ic += 2; iw += 2; …Run Code Online (Sandbox Code Playgroud) 我有一个快速发展且经常变化的CMake C++项目.我正在尝试将编译时间降至最低.
通常,当我重建项目时,尤其是在更改标题之后,我很惊讶需要重新编译多少个编译单元.我正在尝试识别#include可以避免的s,例如通过使用预声明或不在头文件中内联简单函数.
有没有办法从CMake本身,从生成的Makefile,或直接从文件本身找出哪些单位取决于哪些标题?
一个列表会很好,一个可视图形(graphviz?)甚至更好.谷歌对我没有任何帮助.CMake有--graphviz选项,但它可以在目标上运行,而不是单独的编译单元.
跨平台的东西(即仅使用CMake)是首选,但我也会满足于Linux.
我们有许多Git存储库,其中一些包含我们自己的代码,一些包含稍微修改过的第三方库代码.简化的依赖关系图如下所示:
executable_A
| |
| v
| library_B
| |
v v
library_C
Run Code Online (Sandbox Code Playgroud)
所以可执行文件有两个依赖项library_C,一个是直接的,一个是传递的.我希望使用Git子模块和CMake将它们组合在一起,因此简化的目录结构如下所示:
executable_A/
CMakeListst.txt
library_B/
CMakeLists.txt
library_C/
CMakeLists.txt
library_C/
CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
如您所见,library_C存储库作为子模块包含两次.让我们假设两个子模块都指向同一个提交(关于如何强制执行的任何想法都是受欢迎的,但不是这个问题的主题).
我们正在使用add_subdirectory,target_link_libraries并target_include_directories管理这些相互依存关系.很标准.
问题是如果你创建一个具有相同名称的目标两次,CMake不喜欢它,所以它会抱怨:
library_C/CMakeLists.txt上的CMake错误:13(add_library):
add_library无法创建目标"library_C",因为已存在具有相同名称的另一个目标.现有目标是在源目录".../library_B/library_C"中创建的静态库.
有关更多详细信息,请参阅策略CMP0002的文档.
我宁愿不删除executable_Aon 的直接依赖library_C,因为它被拉入via的事实library_B是一个library_B不应该依赖的实现细节.而且,一旦我们添加了另一个依赖项,这种方法就会崩溃executable_A --> library_D --> library_C.
c++ ×4
cmake ×2
git ×2
performance ×2
.net ×1
assembly ×1
bash ×1
const ×1
constructor ×1
dependencies ×1
destructor ×1
enums ×1
github ×1
linux ×1
makefile ×1
optimization ×1
registry ×1
split ×1
static ×1
templates ×1
unix ×1
x86-16 ×1
xor ×1