方法本地结构是否需要执行默认构造函数

时间:2011-10-25 19:49:06

标签: c++ methods struct memory-management

当你在类方法中声明struct时,如何分配struct的内存?例如:

void Foo::Bar(void)
{
    struct timeval a;

    a.tv_sec = 1;
    a.tv_usec = 0;

    ...
}

是否像任何其他本地数据(intdouble等)一样在堆栈上分配,或者是一个被调用的默认构造函数和在堆上分配的内存?

如果struct初始化为struct timeval a = {0, 0};

,该怎么办?

尝试确定将结构设置为类成员还是将其作为本地方法更好,因为该方法经常被调用并且需要尽可能快。

2 个答案:

答案 0 :(得分:4)

  

是否像其他任何本地数据(int,double等)一样在堆栈上分配,或者是一个默认构造函数调用和堆上分配的内存?

它分配在本地存储(堆栈)上 只有在创建运算符的任何new版本(可能是新的位置)时才会在Freestore(堆)上创建对象。
此外,您的结构对象不会超出包含它的函数的范围。 Freestore(Heap)对象将持续存在,直到您明确地调用delete。

每当您创建结构/类的对象时,将为该结构/类调用适当的构造函数(通过匹配参数类型)。在您的情况下,您在创建对象时不传递任何参数,因此将调用Default构造函数。

  

如果struct初始化如此:struct timeval a = {0,0};

它仍然被分配为具有本地存储的对象。

  

尝试确定将结构设置为类成员还是将其作为本地方法更好,因为该方法经常被调用并且需要尽可能快。

在本地存储(堆栈)上创建对象比在Freestore(堆栈)上创建对象更快。 但是,在你的情况下,你根本就没有使用堆。

示例代码的实际分析应告诉您哪一个(本地结构或类成员)更适合您的性能要求。

但是,在将结构作为成员之前,请考虑结构与您的类的关系。它是否与您的班级有has a关系,或者它只是一个公用事业结构。你也应该考虑这个设计方面。

此外,在本地结构或类中可以访问的内容中有 several restrictions ,所以请记住这一点。

答案 1 :(得分:1)

在您的示例中,对象在堆栈上分配,并调用默认构造函数。