我有一个项目,它使用了相当多的C++模板元编程.这使编译时间变长.我知道我不能吃蛋糕并且也吃它但是我想知道如何减少编译时间的一些提示和技巧.我已经尝试过显式实例化,虽然这在某些情况下可能有所帮助,但很多时候,实例对于特定的编译单元是唯一的,在这种情况下,显式实例化无助于提供帮助.现在我们只谈论Clang做得很好.当我在G ++上尝试这个时,编译时间就会爆炸.对于一个文件,我放弃了等待它在45分钟后编译.
我使用的主要是普通的C++ 11技术,我不使用Boost MPL或类似的库.
我想创建一个包装另一种类型的结构,但可以采用实现给定特征的自有和借用版本的值.
例如,假设我有这个特点Foobar:
trait Foobar {
fn foobar(&self);
}
Run Code Online (Sandbox Code Playgroud)
我现在想要创建一个包含值或借用此特征引用的结构:
struct FoobarWrapper<T: Foobar> {
wrapped: T,
extra_stuff: Stuff
}
Run Code Online (Sandbox Code Playgroud)
在这里,我希望FoobarWrapper与两者合作Baz并&Baz给予它impl Foobar for Baz.
我想出了一个可行的解决方案,但我不知道它是否是惯用的,而且只是这样做:
impl<'a, T: Foobar> Foobar for &'a T {
fn foobar(&self) {
(*self).foobar()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我没有弄错的话,这就引用了一个实现Foobar的值,也是Foobar的实现者.但这是你应该这样做的吗?
我正在编写一个程序来读取和写入支持多种像素类型的图像(即RGB,CMYK,灰度等).这些像素类型可以使用不同类型的组件,如下所示:
class (Storable c) => PixelComponent c where
blackWhite :: c -> (c, c)
toInt :: c -> Int
toRealFrac :: (RealFrac a) => c -> a
fromComponent :: (PixelComponent a) => a -> c
instance PixelComponent CUChar where
blackWhite x = (minBound x, maxBound x)
toInt = id
toRealFrac = fromIntegral
fromComponent x = ???
instance PixelComponent CFloat where
black = 0.0
white = 1.0
toInt = truncate
toReal = id
fromComponent x = ???
class (Storable pix) => …Run Code Online (Sandbox Code Playgroud) 我正在做一个Haskell绑定到图像加载库,我想尽可能避免复制.加载图像时,我从包含图像数据的C库中获取数据结构.现在,这个结构对于所有意图和目的都是不可变的,但是将数据从它读入Haskell是一个IO动作.是否可以使用unsafePerformIO(或者也许是unsafeDupablePerformIO以获得更好的性能)来避免将内存复制到Haskell数组或类似内容中?当然,我需要将数据结构指针封装在ForeignPtr或类似的中,并确保不能以任何其他方式访问或修改指针.
这些案件的惯例是什么?
以下函数的工作原理应该与该函数类似,pow(x, 1/k)但围绕该线对称y = 1 - x,并且在 [0, 1] 的两端不具有 0 或 1 斜率:
def sym_gamma(x, k):
if k == 1.0:
return x
a = 1.0 / k - 1.0
b = 1.0 / a
c = k + 1.0 / k - 2.0;
return 1.0 / (a - c * x) - b
Run Code Online (Sandbox Code Playgroud)
可以看出,它没有定义,k = 1所以在这种情况下,我只需 return x。然而,这种特殊情况处理还不够,因为当x不等于但非常接近时,该函数的表现也很差1.0。例如,虽然它应该返回非常接近的东西,但它sym_gamma(0.5, 1.00000001)会产生。0.00.5
如何在稳定性差的情况下实现同样的效果?我知道我可以引入关于kequaling的容差1.0,但这感觉就像黑客,我还想确保该函数在 方面完全平滑 …