gpt4 book ai didi

c++ - 调用空类的构造函数真的会占用内存吗?

转载 作者:可可西里 更新时间:2023-11-01 16:28:00 24 4
gpt4 key购买 nike

假设我有一个类

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";
}

这种优化是安全的,也是最有用的。它允许程序员在没有开销的情况下使用空类来表示非常简单的概念。当前的一些编译器提供了这种“空基类优化”。

关于c++ - 调用空类的构造函数真的会占用内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2016437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com