小编Rob*_*Rob的帖子

不区分大小写的git pickaxe搜索

我试图寻找到一个特定的字符串或任意大写体(例如所有提交foobar,FooBar,fooBar在一个Git仓库)引入/删除.

基于这个SO答案(涵盖了不同的基本用例),我首先尝试使用git grep

git rev-list --all | xargs git grep -i foobar
Run Code Online (Sandbox Code Playgroud)

这非常糟糕,因为它只提供了关于字符串是否存在于提交中的信息,因此我最终得到了大量多余的提交.

然后我尝试了pickaxe,这让我大部分都在那里,例如

git log --pickaxe-regex -S'foobar' --oneline
Run Code Online (Sandbox Code Playgroud)

这只是小写的foobar.我尝试了-i旗帜,但这似乎不适用于该--pickaxe-regex选项.然后我使用这样的模式,这让我更进一步:

git log --pickaxe-regex -S'.oo.ar' --oneline
Run Code Online (Sandbox Code Playgroud)

有没有办法做--pickaxe-regex不区分大小写的匹配?

我正在使用git v1.7.12.4.

git

13
推荐指数
1
解决办法
4356
查看次数

共享库与其接口中的STL对象的GCC兼容性

我有一个STL对象的应用程序,用作插件编写器的C++接口的一部分.

我知道兼容性的最佳选择是使用C接口,但目前不可行.

我知道libstdc ++中从GCC 3.4到4.8的所有内容在ABI方面都是高度兼容的.

因此,例如,如果我使用GCC 4.1进行编译,并且插件供应商编写使用GCC 4.7编译的代码,那么禁止角落情况一切都将在具有与GCC 4.7或更高版本相对应的libstdc ++版本的平台上完成,前提是STL用法是只有.so的内部,以及外部的.so界面使用的是纯粹的C,但对我来说情况并非如此.

所以,我很好奇关于作为插件接口的一部分使用的STL类的情况.我可以安全地在未使用相同编译器版本编译的共享对象之间传递STL对象(例如4.1和4.8)吗?如果人们使用不同的编译器选项,是否有任何关于如何编译和解决模板的问题需要注意什么?

我怀疑它会有问题.然而,GCC人员有可能以某种方式完成这项工作.

对于这个问题,我只对pre-C++ 11编译和链接感兴趣.我也只对使用GCC的Linux和Mac OS X感兴趣.

c++ gcc stl libstdc++

13
推荐指数
1
解决办法
879
查看次数

基于局部变量存在的GDB流量控制

我正在尝试编写一个GDB脚本(遗留,而不是Python),它将打印有关局部变量(C或C++结构)成员的信息,但前提是该局部变量存在.就像是:

# 'magic' should be evaluate to "if 'info locals' has a variable named foo, then
# evaluate to true, otherwise evaluate to false.
if (magic)
    print foo->member
end
Run Code Online (Sandbox Code Playgroud)

我知道这有点人为,因为本地人依赖于堆栈框架(所以我可能最好不要让它以框架为条件),但我仍然想知道沿着这些线条是否有可能.

c c++ gdb

5
推荐指数
1
解决办法
154
查看次数

遗留 GDB 脚本中堆栈跟踪的停止条件

我有获得基于一个GDB的Python脚本的堆栈跟踪附带的Python 2.6源的传统GDB命令脚本(SO不允许超链接,但这里的网址:http://#%20http://svn.python.org/view/*checkout*/python/branches/release26-maint/Misc/

该脚本有一个 while 循环,它根据要退出的程序计数器进行相当脆弱的检查,这(如注释中的原始代码中所述)可能仅适用于直接运行 Python 的情况,而不适用于解释器是从 C/C++ 应用程序中启动。

现有的 while 循环如下所示:

while $pc < Py_Main || $pc > Py_GetArgcArgv
    # ...
    # code for extracting Python stack from local vars in relevant frames
    # of C stack
    # ...

    up-silently 1
Run Code Online (Sandbox Code Playgroud)

对于我想要调试的程序,检查Py_MainPy_GetArgcArgv不会很好地工作,所以我正在寻找一个循环条件,当它到达main.

所以我一直在考虑使用程序计数器、帧指针和堆栈指针的想法,基于如果up-silently失败,它们将具有与以前相同的值,这意味着我在顶部堆栈,像这样:

set $oldpc = -1
set $oldfp = -1
set $oldsp = -1
while !($oldpc == $pc && $oldfp == $fp && $oldsp == $sp)
    # ... …
Run Code Online (Sandbox Code Playgroud)

c c++ python gcc gdb

5
推荐指数
1
解决办法
862
查看次数

从dicts中删除元素时,del或pop是首选项

我对Python比较陌生,并且想知道从a中删除元素时是否有任何理由更喜欢这些方法之一dict

A)使用 del

# d is a dict, k is a key
if k in d:
   del k
Run Code Online (Sandbox Code Playgroud)

B)使用 pop

d.pop(k, None)
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是方法(A)需要做两次查找 - 一次在if语句中,再一次在执行中del,这会使它稍微慢一点pop,只需要一次查找.然后一位同事指出del可能还有优势,因为它是一个关键字,因此可能会更好地优化,而pop最终用户可以替换这种方法(不确定这是否真的是一个因素,但他确实如此)有更多编写Python代码的经验).

我写了一些测试片段来比较性能.它看起来del有优势(如果有人关心尝试或评论正确性,我已经附加了片段).

所以,这让我回到了这样一个问题:除了边际绩效收益之外,是否有理由偏好一个而不是另一个?

以下是测试性能的片段:

天真的考验

import timeit
print 'in:   ', timeit.Timer(stmt='42 in d', setup='d = dict.fromkeys(range(100000))').timeit()
print 'pop:  ', timeit.Timer(stmt='d.pop(42,None)', setup='d = dict.fromkeys(range(100000))').timeit()
print 'del:  ', timeit.Timer(stmt='if 42 in d:\n    del d[42]', setup='d = dict.fromkeys(range(100000))').timeit()
Run Code Online (Sandbox Code Playgroud)

这输出

in:    0.0521960258484
pop:   0.172810077667
del:   0.0660231113434 …
Run Code Online (Sandbox Code Playgroud)

python python-2.7

5
推荐指数
1
解决办法
1874
查看次数

标签 统计

c++ ×3

c ×2

gcc ×2

gdb ×2

python ×2

git ×1

libstdc++ ×1

python-2.7 ×1

stl ×1