有没有人知道一个功能齐全的C++重构工具,可以在大型代码库(大约100.000行)下可靠地工作?
在过去的几年里,我一次又一次地尝试了我能找到的东西:SlickEdit,Eclipse CDT.它们都没有用.
摘要:我花时间评估"Visual Assist X"以及"Refactor for C++".两者都有一些令人印象深刻的功能,但两者都远非完美.如果不进行手动修改,通常无法提取大量代码 - 因此无法获得回报.
"Visual Assist X"具有很好的功能,例如更完整的自动复合等.但它会导致如此多的闪烁并在某些点上减慢很多.
因此我认为答案是:"不,没有适合C++的生产就绪重构工具"
更新2015年3月 至于今天的hdoghmens回复,我尝试了Resharper for C++.他的链接 https://www.jetbrains.com/resharper/对C++没有任何说明.但我发现一年多前在这里公布的Resharper C++:
https://www.jetbrains.com/resharper/features/cpp.html
我用VC2010试用了一个20MB的代码库.
测试1:提取方法:导致Resharper异常.没有源代码更改.
测试2:使用不同来源的提取方法:正常工作
测试3:更改提取函数的签名:破解C++代码的结果:
bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)
Run Code Online (Sandbox Code Playgroud)
也许这就是为什么C++没有列在主页上.
我认为这个问题的答案仍然是"不".
我一直在谷歌搜索C++中的无锁队列.我发现了一些代码和一些试验 - 但我没有能够编译.也欢迎无锁哈希.
摘要:到目前为止,我没有正面答案.没有"生产就绪"库,令人惊讶的是现有的库都没有符合STL容器的API.
我正在使用带有Win32的Stackdumps,将所有返回地址写入我的日志文件.我稍后会将这些与mapfile相匹配(参见我的文章[Post Mortem Debugging] [1]).
编辑::问题解决了 - 请参阅下面我自己的答案.
使用Windows x64,我找不到将返回地址写入日志文件的可靠方法.我试过几种方法:
试验1:指针算术:
CONTEXT Context;
RtlCaptureContext(&Context);
char *eNextBP = (char *)Context.Rdi;
for(ULONG Frame = 0; eNextBP ; Frame++)
{
char *pBP = eNextBP;
eNextBP = *(char **)pBP; // Next BP in Stack
fprintf(LogFile, "*** %2d called from %016LX (pBP at %016LX)\n", Frame,
(ULONG64)*(char **)(pBP + 8), (ULONG64)pBP);
}
Run Code Online (Sandbox Code Playgroud)
这在调试版本中运行良好 - 但它在发布版本中崩溃.Context.Rdi的值在那里没有可用的值.我确实检查了编译器设置的差异(visual Studio 2005).我没有发现任何可疑的东西.
试用版2:使用StackWalk64
RtlCaptureContext(&Context);
STACKFRAME64 stk;
memset(&stk, 0, sizeof(stk));
stk.AddrPC.Offset = Context.Rip;
stk.AddrPC.Mode = AddrModeFlat;
stk.AddrStack.Offset = Context.Rsp;
stk.AddrStack.Mode = AddrModeFlat;
stk.AddrFrame.Offset …Run Code Online (Sandbox Code Playgroud) 如果您在microsoft.com上打开"图形和游戏(Windows)"页面
最后一类被描述为
旧版图形:已过时且不应在新应用程序中使用的技术.
此类别包括(以及其他)以下API:
你怎么看?如果我想今天推出一款新软件,它必须支持Windows XP(仍然约占所有已安装系统的50%).Direct2D需要Windows 7/Vista.还应该使用什么?
我经常遇到问题,我必须扩展编译器生成的复制构造函数.例:
class xyz;
class C
{
...
int a, b, c;
std::set<int> mySet;
xyz *some_private_ptr;
};
Run Code Online (Sandbox Code Playgroud)
假设,some_private_ptr只应在特定条件下复制.对于其他条件,应将其重置为NULL复制.所以我必须编写一个复制构造函数,如:
C::C(const C &other) :
a(other.a),
b(other.b),
c(other.c),
mySet(other.mySet)
{
if(CanCopy(other.some_private_ptr)) // matches condition
some_private_ptr = other.some_private_ptr;
else
some_private_ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
问题是该类可能有许多数据成员,并且当我添加数据成员时,我很可能忘记更新复制构造函数.如果我能写的话,那将是非常好的.
C::C(const C &other) :
C::default_copy(other)
{
if(CanCopy(other.some_private_ptr)) // matches condition
some_private_ptr = other.some_private_ptr;
else
some_private_ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
这将使我的代码更安全,更容易维护.不幸的是我不知道这种可能性.有没有?
.NET的用法会给我什么,我没有使用Win32 - 有时可能使用Google搜索可以重用的50-100行代码?
我正在开发Win32,因为它存在(> 15年).它直接且非常强大,虽然有时它需要比你期望的更多的呼叫,当然你需要跟踪手柄等.但是我们的(250.000 LOC)应用程序安装在不到1分钟内很少见有任何兼容性问题.
关于.NET与Win32(即Win32 vs .Net)的关于SO的几个讨论已经进行了 .但是他们没有回答这个问题.
我不是指外部工具.我想到了架构模式,语言结构,习惯.我最感兴趣的是C++
我最近做了第三版Dijkstra算法,将单一来源的最短路径附加到我的项目中.
我意识到有许多不同的实现在性能上有很大差异,并且在大图中的结果质量也有所不同.使用我的数据集(> 100.000个顶点),运行时间从20分钟到几秒不等.最短路径也变化1-2%.
你知道哪个是最好的实现?
编辑: 我的数据是一个液压网络,每个节点有1到5个顶点.它可以与街道地图相媲美.我对已经加速的算法做了一些修改(使用所有剩余节点的排序列表),现在在一小部分时间内找到相同的结果.我已经搜索了这样的事情了很长一段时间.我想知道这样的实现是否已经存在.
我无法解释结果的细微差别.我知道Dijkstra不是启发式的,但所有的实现似乎都是正确的.更快的解决方案具有更短路径的结果.我只使用双精度数学.
编辑2: 我发现找到的路径的差异确实是我的错.我已经为某些顶点插入了特殊处理(仅在一个方向上有效),并在其他实现中忘记了这一点.
但是我仍然惊讶于Dijkstra可以通过以下变化大幅加速:一般来说Dijkstra算法包含一个循环,如:
MyListType toDoList; // List sorted by smallest distance
InsertAllNodes(toDoList);
while(! toDoList.empty())
{
MyNodeType *node = *toDoList.first();
toDoList.erase(toDoList.first());
...
}
Run Code Online (Sandbox Code Playgroud)
如果你稍微改变一下,它的工作方式相同,但表现更好:
MyListType toDoList; // List sorted by smallest distance
toDoList.insert(startNode);
while(! toDoList.empty())
{
MyNodeType *node = *toDoList.first();
toDoList.erase(toDoList.first());
for(MyNeigborType *x = node.Neigbors; x != NULL; x++)
{
...
toDoList.insert(x->Node);
}
}
Run Code Online (Sandbox Code Playgroud)
看起来,这种修改通过不是数量级的顺序来减少运行时间,而是指数的顺序.它将我的运行时形式从30秒减少到小于2.我在任何文献中都找不到这种修改.同样非常清楚的是,原因在于排序列表.插入/擦除在100.000元素的情况下执行得更糟糕.
回答:
经过大量的谷歌搜索后,我发现了自己.答案很清楚: boost graph lib.太棒了 - 我有一段时间没有找到这个.如果您认为Dijkstra实现之间没有性能差异,请参阅维基百科.
我正在尝试为Windows构建谷歌breakpad.我不明白.我尝试安装autoconf和m4 for Windows似乎工作.但跑步
m4 CXXFLAGS=-m32 CFLAGS=-m32 CPPFLAGS=-m32 ./configure
Run Code Online (Sandbox Code Playgroud)
结果是
func_dirname ()
{
# Extract subdirectory from the argument.
func_dirname_result=NONE:0: m4: ERROR: EOF in string
Run Code Online (Sandbox Code Playgroud)
经过几秒钟的脚本执行.
我搜索了visual studio解决方案文件,但是自修订版581以来它们已被删除.
所以我找到了相关的文章 如何构建谷歌破解.
但是我如何安装gyp?它需要什么先决条件?或者有人为google-breakpad的所有部分都有一个工作(VC2005)sln文件?任何人都可以给我一步一步的描述如何构建它吗?
我正在为学校做一个项目,教师坚持要把所有代码放到一个.cpp文件中(为了方便他的评分).我想在这个文件中定义多个类.这样做会遇到任何问题吗?