从原生C ++重构代码的选项?

时间:2008-09-29 03:11:00

标签: c++ performance refactoring native

因此,在谈论性能时,一个常见的评论是,您使用任何语言编写代码,以最快地完成工作。如果特定区域的性能有问题,那么用C / C ++重写这些位。

但是,如果您从本机C ++应用程序开始怎么办?如果你想用Python,Ruby,C#等语言编写简单位或重构旧位,你有什么选择?请记住,在本机和其他方之间传输数据是必须的。能够简单地调用用“更简单”的语言编写的函数,同时将C ++类作为数据传递,将是美好的。

我们有一个硬件Win32应用程序,如果我们可以在C#或其他东西中编写新代码或重构旧代码,将会受益匪浅。它很少需要C ++的复杂性,处理这些小小的东西会拖累编程过程。

5 个答案:

答案 0 :(得分:2)

正如Aaron Fischer建议的那样,尝试在打开/ clr选项的情况下重新编译C ++应用程序,然后开始利用.Net平台。

如果您已经了解C#和C ++,那么CLI / C ++很容易上手,它提供了.Net世界和本机C ++之间的桥梁。

如果当前的C ++代码无法在/ clr打开的情况下干净地编译,那么我建议您尝试将应用程序构建为静态库(不启用/ clr),然后将main()置于CLI /中调用遗留应用入口点的C ++项目。这样你至少可以开始利用.Net来获得新的功能。

有关已经“移植”到.Net CLI / C ++的“遗留”C / C ++应用程序的示例,请查看Quake 2Quake 3: Arena的.Net端口。

答案 1 :(得分:1)

如果你想在C ++和Python之间工作,那么Boost Python就是你正在寻找的。您可以手动为Cython编写C Python绑定,但这在很多方面限制了您编写代码的方式。这是最简单的方法,如this tutorial的一些摘录中所示:

执行hello世界的简单函数:

char const* greet()
{
   return "hello, world";
}

Boost python代码需要将它暴露给python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

如何使用python中的代码:

>>> import hello_ext
>>> print hello.greet()
hello, world

相反的方向更难,因为python不能编译为本机代码。您必须将python解释器嵌入到您的C ++应用程序中,但需要完成的工作记录在here。这是调用python解释器并提取结果的示例(python解释器定义了在C ++中使用的对象类):

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

答案 2 :(得分:1)

嗯,这真的取决于语言。例如,Python接口最容易使用Boost Python完成,许多其他语言将要求您像使用C一样使用C库并将您的回调声明为外部“C”(不幸的是,你可以'通常使用其他语言的C ++类定义。

但是我也会问你打算用它来做什么,因为C ++是一种复杂的语言,但是一旦你熟悉它,它就会非常强大,而且编码也不比其他语言困难得多。我能想到的唯一非常好的例外是你是否计划使用仅存在于一种语言中的强大库,并且没有一个像样的C ++替代方案(图形库可能是最好的例子,因为你必须非常熟悉与他们有效地使用它们。)

值得指出的是,如果将C ++代码与另一种语言接口,则会失去该语言授予的跨平台兼容性。

答案 3 :(得分:1)

您可以将c ++项目中的公共语言运行时支持更改为/ clr。从这一点开始,您可以在c ++代码中使用任何.net功能。这包括在项目中创建winforms。您还可以添加一个处理ui和其他功能的c#库。

答案 4 :(得分:0)

在.NET世界中,您始终可以选择为C#/ VB.NET程序集创建COM / ActiveX互操作层。

然后,您可以使用C ++应用程序中的普通COM API来创建实际包装.NET程序集的此COM服务器的实例。

关于这一点的好处是,诸如int,bool,string,float等简单参数将映射到它们的COM等价物。但据我所知,无法轻松传递完整的.NET对象(您创建的类的实例)。

还要注意COM互操作调用相对较慢。您不应该在紧密循环中不断地从C ++代码中调用COM互操作方法。

COM / ActiveX传统上依赖于Windows注册表,并不理想,因为它是一个很大的依赖。但是,也可以使用Registration-Free COM互操作来避免这种依赖。

This article涵盖了为COM互操作注册.NET程序集所需的步骤。