今天我尝试检测核心转储并提醒我的事实上确实发现了一个错误的断言(当我在前台或后台的命令行上运行它时通常核心转储它)但没有核心被丢弃.我写了这个简单的测试:
int main
{
sleep(3);
assert(false);
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行时,它将始终进行核心转储.但是当我把它放在crontab上时,我收到了来自cron守护进程的电子邮件说:
rocket: main.cpp:10: int main(int, char**): Assertion `false' failed.
/bin/sh: line 1: 32448 Aborted ./rocket
Run Code Online (Sandbox Code Playgroud)
并且没有放入核心文件/cores.为什么这样,我怎么能得到我的核心?
我可以看到单个文件的权限ls -l.
如果目录中有数百或数千个文件 - 大多数我无法阅读,我如何查看我有权阅读哪些文件?
我有大约70-150个不同的结构X,带有无符号整数ID字段.它们在程序初始化时被读入并初始化,之后从未修改过.在以下(或其他一些方法?)中访问它们(发生了很多次)的最快方法是什么?
使用std :: vector v; 其中v [X.id] = X; 通过做X&x = v [id]来访问; (这应该在开头做一个副本,但稍后只是在基本上是平面数组上通过id进行查找.
与上面相同但是std :: vector v; 用X*x = v [id]; 我对这个问题很谨慎,因为它有一个额外的间接层.
一个std :: map - 与上面相比感觉有点矫枉过正?
与上面相同但是unordered_map - 再次给出70-150次出现可能甚至不能超过建议3.
还有什么比这更聪明的?我在1中看到的一个问题是它在访问模式中可能有点稀疏,但如果这是最快的方式,则不确定如何解决这个问题.
我知道如果虚拟关键字覆盖虚拟基本函数,则不需要在派生类成员函数声明中重用它,但是这样做是为了明确它是虚拟的吗?另外,声明和/或定义中是否存在const关键字呢?我认为Alexandrescu提到了一些关于此的事情,但我不记得它是什么?
我在代码库中有一个类似于以下内容的库:
namespace rat {
...
enum myEnum {
BLUE,
RED
}
...
} //namespace rat
Run Code Online (Sandbox Code Playgroud)
之后我尝试使用该库在代码库中编译一个应用程序,当我使用命名空间rat(代码库主命名空间)说BLUE可能是rat::myEnum rat::BLUE或者rat::enums::Freq rat::enums::BLUE来自我不熟悉的其他文件时,它警告我有歧义(并且不是我的)有一个枚举Freq,在名称空间鼠标中的名称空间枚举中有一个名为BLUE的人...
用户代码中有没有办法说出我现在想要哪一个?或者我必须在名称空间mylib中嵌套mylibs枚举,然后说rat :: enums :: BLUE或rat :: mylib :: BLUE?
我刚刚在代码中看到了这个函数,直观地说它应该返回大于参数的下一个素数.然而,当我这样称呼它时,我得到了53!然后当我通过54时,我得到97.我没有找到它在网上做什么的描述,有人能指出我或者有人知道这是做什么的吗?
我保持一个索引计数器,应该像圆形数组一样.我强制大小为2的幂,因此用于size_t MASK = size_ - 1在遍历时替换模数:
index_ = (++index_) & MASK;
Run Code Online (Sandbox Code Playgroud)
但问题是,在我的情况下,我有时会意识到我可以重用我下次在这里发布的那个索引,所以当发生这种情况时我会有这样的事情:
if (canReuseLastUsedIndex())
--index_;
Run Code Online (Sandbox Code Playgroud)
但是当最后一次抛出index_是零时,这会崩溃,因为这不会缠绕到size_(即MASK+1).有这种方法可以让这种情况发生吗?还是什么东西很快?(即,优选不具有地说:if (index_) --index_; else index_ = size_)
c++ optimization performance bit-manipulation bitwise-operators
我在一个简单的main中有以下源代码:
int main(int argc, char** argv)
{
double x = atof(argv[1]);
double y = atof(argv[2]);
double res = x + std::floor((y - x) * .5 * 100 + .5)*0.01;
std::cout << res << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我用75.21 75.22运行上面它给了我75.22但如果我用7.21和7.22运行它它给了我7.21.这两个数字相差0.01,所以我不明白为什么会这样?
我在一个.c文件中有以下内容(这是一个小得多的数组来举例说明):
static const char* __someNames[] =
{
"Fox",
"Wulf",
"Cat"
};
Run Code Online (Sandbox Code Playgroud)
然后我会定义一个像这样的宏:
#define EXAMPLE(N) XXX
Run Code Online (Sandbox Code Playgroud)
在哪里,我希望XXX被替换为__someNames[N]没有"..ie我想
#define EXAMPLE(1)
Run Code Online (Sandbox Code Playgroud)
扩展到:
Wulf
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
编辑
一些很酷的想法.这更多是出于对我想要做的好奇心的好奇心.我喜欢#include"file.h#两次使用重新定义的宏的想法......如果我也可以使用boost预处理器(我添加了c ++和boost标签来提问) - 我是否可以绕过额外的"file.h"?每个字符串#define的字符串也很酷,但考虑到我会有多少#defines ...
我有一个针对某些结构的辅助基类,它使用 CRTP 来帮助我获取有关它们的一些信息:
template <class T>
struct MyHelper
{
size_t size() const { return sizeof(T); }
};
Run Code Online (Sandbox Code Playgroud)
我已经在代码库的各个库中使用了使用此定义的结构,并且我希望有一种方法来记录它们。我的第一个想法是这样的:
template <class T>
struct MyHelper
{
size_t size() const { return sizeof(T); }
virtual void print(std::ostream& out) const { out << "(" << sizeof(T) << ")"; }
};
Run Code Online (Sandbox Code Playgroud)
但后来我意识到这行不通,原因有几个 - 其中之一是添加虚拟实际上改变了 POD 数据的大小。
有没有办法在没有 virtual 关键字的情况下让我拥有一个使用上述实现的默认 toStr 方法,除非特定的派生类 T 有一个实现,在这种情况下它会遵循该实现?
我正在运行一个输出这样的行的程序(简化):
A
E
E
R
E
Run Code Online (Sandbox Code Playgroud)
等等......而且我试图找到字母代码 E 的最长出现时间,中间没有其他东西。我怀疑最简单的方法是尝试连续查找 N,其中我尝试 N 的几个降序值,但我不确定如何处理特定情况,例如 3 个连续的 E 行。使用 sed 命令容易吗?我想到了 awk 模式范围,但它允许介于两者之间的任何内容。
正在看clojure第 9 章底部的练习,寻找勇敢和真实的人 (特别是搜索多个引擎并返回每个引擎的第一次命中的最后一个)
我用 slurp 部分嘲笑实际搜索是这样的:
(defn search-for
[query engine]
(Thread/sleep 2000)
(format "https://www.%s.com/search?q%%3D%s", engine query))
Run Code Online (Sandbox Code Playgroud)
并实现了这样的行为:
(defn get-first-hit-from-each
[query engines]
(let [futs (map (fn [engine]
(future (search-for query engine))) engines)]
(doall futs)
(map deref futs)))
Run Code Online (Sandbox Code Playgroud)
(我知道这里的返回是一个列表,练习要求一个向量,但可以into为此做一个......)
但是当我在 REPL 中运行它时
(time (get-first-hit-from-each "gray+cat" '("google" "bing")))
Run Code Online (Sandbox Code Playgroud)
添加后似乎需要 2 秒doall(因为 map 返回一个惰性 seq,我认为除非我使用 seq,否则任何期货都不会启动,(last futs)似乎也有效)但是当我time在 REPL 中使用宏时,它会报告即使需要 2 秒,也几乎不消耗时间:
(time (get-first-hit-from-each "gray+cat" '("google" "bing")))
"Elapsed time: 0.189609 msecs"
("https://www.google.com/search?q%3Dgray+cat" "https://www.bing.com/search?q%3Dgray+cat") …Run Code Online (Sandbox Code Playgroud)