小编Tho*_*mas的帖子

tempfile和mktemp有什么区别?

我遇到的大多数系统都有tempfile(1)mktemp(1).有语法差异,也mktemp可以创建目录,但它们似乎也做同样的事情.

这两者有什么区别吗?为什么两者都存在?比另一个更标准吗?如果我只想安全地创建一个临时文件,是否有理由更喜欢一个而不是另一个?

我怀疑这背后有一些有趣的Unix知识,但我的搜索没有任何结果.

unix linux bash

28
推荐指数
2
解决办法
5354
查看次数

为什么.NET"应用程序设置"不存储在注册表中?

早在九十年代,微软推出了Windows注册表.应用程序可以将设置存储在不同的配置 有适用于应用程序范围和用户特定范围的配置单元,这些范围放置在适当的位置,以便漫游配置文件正常工作.

在.NET 2.0及更高版本中,我们有一个名为Application Settings的东西.应用程序可以使用它们来存储XML文件,app .exe.config和user .config中的设置.这些适用于应用程序范围和用户特定的范围,并且这些范围放置在适当的位置,以便漫游配置文件正常工作.

听起来有点熟?这些应用程序设置由XML文件支持的原因是什么,而不是简单地使用注册表?这不是注册表的目的吗?

我能想到的唯一原因是注册表是特定于Windows的,而.NET试图与平台无关.这是一个(或那个)原因,还是有其他我忽视的考虑因素?

.net registry application-settings

26
推荐指数
6
解决办法
6179
查看次数

(Ab)使用构造函数和析构函数进行副作用的不良做法?备择方案?

在OpenGL中,人们经常编写如下代码:

glPushMatrix();
// modify the current matrix and use it
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

本质上,状态已更改,然后执行一些使用新状态的操作,最后恢复状态.

现在这里有两个问题:

  1. 忘记恢复状态很容易.
  2. 如果中间的代码抛出异常,则永远不会恢复状态.

在真正的基于对象的编程风格中,我编写了一些实用程序类来克服这些问题,如下所示:

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的方式,因为它涉及一个看似无用的变量; 永远不会明确访问有问题的"资源".我只是没有意识到这种特殊用法是如此常见.

c++ constructor destructor design-patterns

21
推荐指数
4
解决办法
2243
查看次数

如何添加git repo作为自身的子模块?(或者:如何以编程方式生成GitHub页面?)

我想开始在我的项目网站上使用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)

git github git-submodules

21
推荐指数
2
解决办法
4228
查看次数

如何在保留子目录的同时拆分git存储库?

我想要的是这个问题.但是,我希望拆分为单独仓库的目录仍然是该仓库中的子目录:

我有这个:

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的内容移动到历史记录中的子目录中,我可以使用此答案中的方法.

git split git-filter-branch

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

设置寄存器为1或(-1)的最有效方法

我现在正在参加一个装配课程,那个检查我们家庭作业的人是一个非常迂腐的老派优化狂.例如,如果他看到,他会扣除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)

我真的需要一个好成绩,所以我试图让它尽可能优化.(我需要优化时间和代码大小)

performance assembly xor cpu-registers x86-16

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

在类型特征中,为什么人们使用枚举而不是静态const作为值?

例如,这就是我写它的方式,它编译并且工作得很好:

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不是?

c++ enums static templates const

19
推荐指数
3
解决办法
2294
查看次数

如何加速我的稀疏矩阵求解器?

我正在使用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)

c++ optimization performance sparse-matrix

17
推荐指数
2
解决办法
2933
查看次数

如何从CMake或make输出编译依赖项?

我有一个快速发展且经常变化的CMake C++项目.我正在尝试将编译时间降至最低.

通常,当我重建项目时,尤其是在更改标题之后,我很惊讶需要重新编译多少个编译单元.我正在尝试识别#include可以避免的s,例如通过使用预声明或不在头文件中内联简单函数.

有没有办法从CMake本身,从生成的Makefile,或直接从文件本身找出哪些单位取决于哪些标题?

一个列表会很好,一个可视图形(graphviz?)甚至更好.谷歌对我没有任何帮助.CMake有--graphviz选项,但它可以在目标上运行,而不是单独的编译单元.

跨平台的东西(即仅使用CMake)是首选,但我也会满足于Linux.

dependencies makefile cmake

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

如何使用Git子模块和CMake处理传递依赖冲突?

我们有许多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_librariestarget_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++ cmake git-submodules

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