一直有很多人闹不清 .def
, .fd
, .pfb
之类文件的作用,这里正好看到 egreg 的回答,感觉很好,就翻译过来。
谈谈 C++ 中的右值引用
最近在改 XGBoost 的代码。XGBoost 在代码中使用了很多来自 C++11 标准中的特性,让我比较好奇和困惑的,就有其中关于右值引用的部分。涉及到代码里,有比较明显的两类用法:
1 | std::move(foo) |
1 | std::vector<std::unique_ptr<T>> |
前者是使用 std::move
返回 foo
的右值引用;后者则在容器 std::vector
中放入了不可复制只能移动的类的对象(智能指针 std::unique_ptr
),当你尝试用常规方法将整个 std::vector
中的元素依次加入另一个 std::vector
的时候,编译器就会报错,提示 std::unique_ptr
的拷贝构造函数是被删除的。
因为好奇和困惑,所以想要把它们搞清楚,于是有了这篇文章。
在 Tmux 的 session 之间移动窗口
继续记录一下 Tmux 的技巧。
实际使用中,我会在同一个宿主机上开多个 Tmux session。通常来说,每个 Session 内的不同 Windows 共同完成一件事情。这就意味着,同一个 Session 可能用 SSH 连着不同的机器。
某时刻,在 Session 1 中的 Window 1 已经完成任务;恰好,它连着机器 A,而 Session 2 正需要一个连着机器 A 的终端。此时就会考虑把 A 的终端从 Session 1 中移到 Session 2。
这可以用 Tmux 命令 move-window
来实现。
互联网下半场对个人而言意味着什么?
互联网的人口红利已经结束了,上半场的粗犷增长已经结束,可以算是进入下半场了。所以我在想,这个下半场对于个人而言,意味着什么。
C++ 惯用法 CRTP 简介
虚函数与动态绑定
C++ 通过类的继承与虚函数的动态绑定,实现了多态。这种特性,使得我们能够用基类的指针,访问子类的实例。例如我们可以实现一个名为 Animal
的基类,以及 Cat
, Dog
等子类,并通过在子类中重载虚函数 jump
,实现不同动物的跳跃动作。而后我们可以通过访问 Zoo
类的实例中存有 Animal
指针的数组,让动物园中所有的动物都跳一遍。
1 | class Zoo { |
在每次执行 animal->jump()
的时候,系统会检查 animal
指向的实例实际的类型,然后调用对应类型的 jump
函数。这一步骤需要通过查询虚函数表(vtable
)来实现;由于实际 animal
指向对象的类型在运行时才确定(而不是在编译时就确定),所以这种方式称为动态绑定(或者运行时绑定)。
因为每次都需要查询虚函数表,所以动态绑定会降低程序的执行效率。为了兼顾多态与效率,有人提出了 Curiously Recurring Template Pattern 的概念。