在这个答案的启发下,我使用以下解决方案作为只读成员变量:
template <class T, class OWNER>
class readonly
{
friend OWNER;
public:
explicit readonly(const T &t) : m_t(t)
{
}
~readonly()
{
}
operator const T&() const
{
return m_t;
}
private:
T& operator =(const T &t)
{
m_t = t;
return m_t;
}
T m_t;
};
Run Code Online (Sandbox Code Playgroud)
哪个效果很好,为了优化性能,我会像这样使用它:
class A
{
public:
A()
{
}
~A()
{
}
#ifdef _DEBUG // DON'T USE THIS SWITCH, SEE ANSWERS BELOW!
readonly<int, A> m_x, m_y;
#else
int m_x, m_y;
#endif
};
Run Code Online (Sandbox Code Playgroud)
但是,我希望消除预编译器开关,它检查我们是否正在进行调试或发布构建......是否有人使用宏或聪明的模板技巧看到解决方案?
编辑:我已经在循环中检查了性能,它使用VS2010产生大约15~20%的开销.它不会产生相同的代码,启用自动内联.
编辑#2:我创建了一个单元测试,消除了所有其他的东西.我没有性能损失了,太好了,毕竟没有问题.谢谢您的帮助!我已经修复了构造函数,很好的调用.
您的优化是无用的,将产生完全相同的代码.所有这些readonly都是微不足道的,并且将被内联,从而消除了使用原始T可能产生的任何开销.因此,解决方案是不修复不存在的问题,并且readonly<int, A>无论是否是调试版本都使用.
正如@MooingDuck指出的那样,你应该改变你的构造函数以使用init list(并且可能也使它显式化).
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |