我对'unordered_map'这个名字感到很困惑.该名称表明钥匙根本没有订购.但我一直认为它们是按哈希值排序的.或者是错误的(因为这个名字意味着他们没有订购)?
或者说不同:是吗?
typedef map<K, V, HashComp<K> > HashMap;
Run Code Online (Sandbox Code Playgroud)
同
template<typename T>
struct HashComp {
bool operator<(const T& v1, const T& v2) const {
return hash<T>()(v1) < hash<T>()(v2);
}
};
Run Code Online (Sandbox Code Playgroud)
同样的
typedef unordered_map<K, V> HashMap;
Run Code Online (Sandbox Code Playgroud)
?(好吧,不完全是,STL会在这里抱怨,因为可能有键k1,k2,k1 <k2和k2 <k1都没有.你需要使用multimap并覆盖等号检查.)
或者不同的是:当我遍历它们时,我可以假设密钥列表按其哈希值排序吗?
template<typename T1, typename T2>
class Bimap {
public:
class Data;
typedef Data* DataP;
typedef std::multimap<T1, DataP> T1Map;
typedef std::multimap<T2, DataP> T2Map;
class Data {
private:
Bimap& bimap;
T1Map::iterator it1;
/*...*/
};
};
Run Code Online (Sandbox Code Playgroud)
这给了我这个编译错误:
error: type 'std::multimap<T1, Bimap<T1, T2>::Data*, std::less<_Key>, std::allocator<std::pair<const T1, Bimap<T1, T2>::Data*> > >' is not derived from type 'Bimap<T1, T2>::Data'
那是什么意思?这里有什么问题?
通常声称RPython(Python的一个子集)是静态类型的.(例如在维基百科上.)
最初,我想知道他们如何将它添加到Python并认为他们可能已经添加了添加语句的要求,例如assert isinstance(arg1, ...)在每个函数的开头(但我真的不相信).
然后我查看了一些RPython代码,它看起来并没有真正的静态类型.在许多情况下,可能是编译器可以证明函数参数只能是某些类型,但绝对不是在所有情况下.
例如,这是RPython的实现string.split:
def split(value, by, maxsplit=-1):
bylen = len(by)
if bylen == 0:
raise ValueError("empty separator")
res = []
start = 0
while maxsplit != 0:
next = value.find(by, start)
if next < 0:
break
res.append(value[start:next])
start = next + bylen
maxsplit -= 1 # NB. if it's already < 0, it stays < 0
res.append(value[start:len(value)])
return res
Run Code Online (Sandbox Code Playgroud)
在关于RPython的PyPy文档中,有人说:" 变量应该包含最多一种类型的值 ".
那么,函数参数也算作变量吗?或者在什么意义上RPython静态输入?或者这实际上是错误的?
我有这个代码:
static std::mt19937 rnd;
// ...
static uint32_t rndInt(uint32_t min, uint32_t max) {
return std::uniform_int_distribution<uint32_t>(min,max)(rnd);
}
Run Code Online (Sandbox Code Playgroud)
这是好的做法还是应该存储uniform_int_distribution?
dict自 Python 3.6 起保持插入顺序(请参阅此)。
OrderedDict就是为了这个目的而开发的(Python 3.6之前)。
dict从 Python 3.6 开始, or的键顺序是否始终相同OrderedDict?
我想知道我是否可以在我的代码中执行此操作并始终具有相同的行为(除了相等性以及 中的一些扩展方法OrderedDict)但更有效:
if sys.version_info[:2] >= (3, 6):
OrderedDict = dict
else:
from collections import OrderedDict
Run Code Online (Sandbox Code Playgroud)
或者换句话说,对于 Python >=3.6,有什么理由使用OrderedDict?
似乎JVM使用了一些固定数量的内存.至少我经常看到参数-Xmx(对于最大尺寸)和-Xms(对于初始尺寸)表明这一点.
我觉得Java应用程序不能很好地处理内存.我注意到的一些事情:
甚至一些非常小的示例演示应用程序也会加载大量内存.也许这是因为加载了Java库.但为什么需要为每个Java实例加载库?(这似乎是因为多个小应用程序线性占用更多内存.请参阅此处了解我描述此问题的一些细节.)或者为什么这样做?
像Eclipse这样的大型Java应用程序经常会因一些OutOfMemory异常而崩溃.这总是很奇怪,因为我的系统上仍然有足够的内存.通常,它们会在运行时消耗越来越多的内存.我不确定他们是否有一些内存泄漏,或者这是因为内存池中的碎片 - 我觉得后者就是这种情况.
例如,Java库似乎需要比类似强大的库(如Qt)更多的内存.为什么是这样?(比较,启动一些Qt应用程序并查看它们的内存使用情况并启动一些Java应用程序.)
为什么它不仅仅使用基础系统技术malloc和free?或者如果他们不喜欢libc实现,他们可以使用jemalloc(就像在FreeBSD和Firefox中一样),这似乎相当不错.我很确定这会比JVM内存池表现更好.而且不仅表现更好,还需要更少的内存,尤其是 适用于小型应用.
另外:有人已经尝试过吗?我会对基于LLVM的Java JIT编译器感兴趣,它只使用malloc/ free进行内存处理.
或者这也可能与JVM实现和实现不同?我主要使用Sun JVM.
(另请注意:我不是直接在这里谈论GC.GC只负责计算可删除的对象并初始化内存释放但实际的释放是一个不同的子系统.Afaik,它是一些自己的内存池实施,而不仅仅是打电话free.)
编辑:一个非常相关的问题:为什么(Sun)JVM具有固定的内存使用上限?或者换句话说:为什么JVM处理内存分配的方式与本机应用程序不同?
此代码有效:
std::ifstream f(mapFilename.c_str());
std::string s = std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Run Code Online (Sandbox Code Playgroud)
因此mapFilename是std::string和void ParseGameState(const std::string&);.
而这不是:
std::ifstream f(mapFilename.c_str());
std::string s(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
ParseGameState(s);
Run Code Online (Sandbox Code Playgroud)
这是错误:
game.cpp: In member function ‘int Game::LoadMapFromFile(const std::string&)’:
game.cpp:423: error: no matching function for call to ‘ParseGameState(std::string (&)(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> > (*)()))’
game.cpp:363: note: candidates are: ParseGameState(const std::string&)
Run Code Online (Sandbox Code Playgroud)
所以它似乎s在这种情况下识别为函数声明而不是变量声明.
这是为什么?这是GCC 4.2.1(Apple版本)中的错误吗?或者GCC是否正确处理了这个问题?这在C++标准中是否未定义?
我正在用Python做一些繁重的计算(使用OpenCV和Numpy),最后,我最终得到了大量的内存使用(> 1GB),所有参考都应该消失,我只有最终结果(不应该超过几MB).
为了调试这个,如果我能以某种方式得到一些统计信息,这将显示我有多少对象实例,它们是什么类型,按它们占用的内存总量(每个对象类)排序,这将是很好的.
或者甚至更好:不是每个对象类,而是每个创建对象的源代码行(我猜这个信息不可用,除非我在Python中激活一些调试会使计算太慢,所以我不确定是否会这样做很有帮助).
我能以某种方式获得这样的统计数据吗?或者我该如何调试?
有些人误解了我:我只需要知道如何调试内存使用情况.处理/运行时间是完美的.
我正在使用此代码获取窗口标题:
tell application "System Events"
set frontApp to name of first application process whose frontmost is true
end tell
tell application frontApp
set window_name to name of front window
end tell
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况下,这会失败.显然,当没有打开的窗口时它会失败,但那是好的.但是,在某些情况下,例如Texmaker,它会因错误而失败.它也不适用于预览.
什么是获得窗口标题的方法,即使像Texmaker这样的情况?
在libuv源代码中,我找到了这段代码:
/* The if statement lets the compiler compile it to a conditional store.
* Avoids dirtying a cache line.
*/
if (loop->stop_flag != 0)
loop->stop_flag = 0;
Run Code Online (Sandbox Code Playgroud)
有人能解释一下吗?
什么是缓存行?
另外,我猜条件存储是一些汇编指令,它检查一些东西,如果成功,写一些值.对?
这种结构什么时候有意义?我想并不总是,因为否则编译器会一直使用条件存储,对吧?