我有一个类,它在我的软件的所有代码中被广泛使用。该类是具有几何几何函数的点抽象,并且按坐标类型(例如long或double)进行模板化。如果在动态库之间传递了这一点,我会收到编译器警告C4252:类'Point'需要dll接口供'OtherClass'类的客户端使用,但代码运行良好且快速,因为所有库都具有相同的编译设置。如何保持内置调用但避免编译器警告?
由于我们的政策是没有任何警告,在所有我们决定,以纪念两种广泛使用的模板特DLL导出的这样的(在头与模板):
template class __declspec(dllexport) Point<long>;
template class __declspec(dllexport) Point<double>;
但是现在的编译器替换共同所有的内联函数调用,因为这个类被大量使用,我们的代码变得更慢。
现在的问题是:有没有什么方法可以在每个使用库的地方保持调用内联,但仍然在dll之间传递数据并避免警告?
我们使用Microsoft VC++ 2012编译器。
根据我的经验,如果速度是我使用静态链接代码,而不是DLL文件,为你准确描述的原因,然而,回想起来实现更好的性能的问题,我觉得thjere可能会有一些方法来达到你是什么尽管我怀疑基准测试仍然会显示静态链接的代码更快。我正在研究强制dll在加载时驻留内存,以便可以实现与内置/静态链接代码类似的性能。我会在今天晚些时候回复你:) – GMasucci
问题不在于将调用从静态变为动态,而是将内联函数更改为通用调用函数。只要你标记你的类/函数的DLL导出,你不会再有任何内联函数。 – Dmytro
是的,这又回到了静态/动态链接:如果编译器不知道函数后面代码的具体细节,那么在编译时你不能在编译时使用“内联”代码。源代码必须在编译时可用于内联到调用位置,此时DLL会变得不必要,因为代码已经在exe中。 – GMasucci