假设我有一个像
class Empty{
Empty(int a){ cout << a; }
}
然后我使用
int main(){
Empty(2);
return 0;
}
这会导致在堆栈上分配任何内存以创建“空”对象吗?显然,需要将参数插入堆栈,但是我不想增加任何额外的开销。基本上,我将构造函数用作静态成员。
我要这样做的原因是由于模板。实际的代码看起来像
template <int which>
class FuncName{
template <class T>
FuncName(const T &value){
if(which == 1){
// specific behavior
}else if(which == 2){
// other specific behavior
}
}
};
这使我可以写类似
int main(){
int a = 1;
FuncName<1>(a);
}
这样我就可以专门化一个模板参数,而不必指定
T
的类型。另外,我希望编译器可以优化构造函数内部的其他分支。如果有人知道这是真的还是如何检查,将不胜感激。我还认为,将模板放入情况中不会从上面改变“空类”问题,对吗? 最佳答案
报价Stroustrup:
为什么空类的大小不为零?
确保两个不同对象的地址不同。由于相同的原因,“new”总是返回指向不同对象的指针。考虑:
class Empty { };
void f()
{
Empty a, b;
if (&a == &b) cout << "impossible: report error to compiler supplier";
Empty* p1 = new Empty;
Empty* p2 = new Empty;
if (p1 == p2) cout << "impossible: report error to compiler supplier";
}
有一条有趣的规则说空的基类不需要用单独的字节表示:
struct X : Empty {
int a;
// ...
};
void f(X* p)
{
void* p1 = p;
void* p2 = &p->a;
if (p1 == p2) cout << "nice: good optimizer";
}
此优化是安全的,并且可能是最有用的。它允许程序员使用空类来表示非常简单的概念,而不会增加开销。当前一些编译器提供了这种“空基类优化”。