小编RED*_*AIR的帖子

是否有一个可用的C++重构工具?

有没有人知道一个功能齐全的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++ refactoring

159
推荐指数
7
解决办法
5万
查看次数

在C++中是否有生产就绪的无锁队列或散列实现

我一直在谷歌搜索C++中的无锁队列.我发现了一些代码和一些试验 - 但我没有能够编译.也欢迎无锁哈希.

摘要:到目前为止,我没有正面答案.没有"生产就绪"库,令人惊讶的是现有的库都没有符合STL容器的API.

c++ stl lock-free

77
推荐指数
9
解决办法
4万
查看次数

如何使用Windows x64记录堆栈帧

我正在使用带有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)

c c++ 64-bit winapi callstack

25
推荐指数
1
解决办法
3万
查看次数

GDI,GDI +和OpenGL真的已经过时/弃用了吗?

如果您在microsoft.com上打开"图形和游戏(Windows)"页面

最后一类被描述为

旧版图形:已过时且不应在新应用程序中使用的技术.

此类别包括(以及其他)以下API:

  • GDI
  • GDI +
  • OpenGL的

你怎么看?如果我想今天推出一款新软件,它必须支持Windows XP(仍然约占所有已安装系统的50%).Direct2D需要Windows 7/Vista.还应该使用什么?

opengl graphics winapi gdi+ gdi

20
推荐指数
4
解决办法
1万
查看次数

如何扩展编译器生成的复制构造函数

我经常遇到问题,我必须扩展编译器生成的复制构造函数.例:

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)

这将使我的代码更安全,更容易维护.不幸的是我不知道这种可能性.有没有?

c++ copy-constructor

18
推荐指数
3
解决办法
1675
查看次数

.NET给了我什么,Win32没有?

.NET的用法会给我什么,我没有使用Win32 - 有时可能使用Google搜索可以重用的50-100行代码?

我正在开发Win32,因为它存在(> 15年).它直接且非常强大,虽然有时它需要比你期望的更多的呼叫,当然你需要跟踪手柄等.但是我们的(250.000 LOC)应用程序安装在不到1分钟内很少见有任何兼容性问题.

关于.NET与Win32(即Win32 vs .Net)的关于SO的几个讨论已经进行了 .但是他们没有回答这个问题.

.net c++ windows winapi

13
推荐指数
5
解决办法
2857
查看次数

哪种编程技术可以帮助您在错误投入生产之前避免或解决错误

我不是指外部工具.我想到了架构模式,语言结构,习惯.我最感兴趣的是C++

c++ architecture debugging design-patterns

12
推荐指数
12
解决办法
1197
查看次数

你知道的最快的Dijkstra实现是什么(在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实现之间没有性能差异,请参阅维基百科.

c++ algorithm performance

11
推荐指数
1
解决办法
2万
查看次数

如何为Windows构建谷歌google-breakpad?

我正在尝试为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文件?任何人都可以给我一步一步的描述如何构建它吗?

visual-studio-2005 build google-breakpad

10
推荐指数
2
解决办法
9535
查看次数

是否可以在一个.cpp文件中定义多个类?

我正在为学校做一个项目,教师坚持要把所有代码放到一个.cpp文件中(为了方便他的评分).我想在这个文件中定义多个类.这样做会遇到任何问题吗?

c++ class

9
推荐指数
5
解决办法
4万
查看次数