方法局部结构是否需要执行默认构造函数



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

void Foo::Bar(void)
{
    struct timeval a;
    a.tv_sec = 1;
    a.tv_usec = 0;
    ...
}

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

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

试图决定是将结构体作为类成员还是将其作为局部方法更好,因为该方法被频繁调用并且需要尽可能快。

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

在本地存储(堆栈)上分配。
只有在创建对象时使用new版本的操作符(可能是placement new除外)时,才会在Freestore(堆)上创建对象。
此外,您的结构对象不会在包含它的函数范围之外持续存在。一个Freestore(Heap)对象会一直存在,直到你显式地对它调用delete。

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

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

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

试图决定是将结构体作为类成员还是将其作为局部方法更好,因为该方法被频繁调用并且需要尽可能快。

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

对示例代码的实际分析将告诉您哪一个(局部结构或类成员)更适合您的性能需求。

但是,在使结构体成为成员之前,请考虑它与类的关系。它是否与您的类有has a关系,或者它只是一个实用程序结构。你也应该考虑设计方面的问题。

另外,对于在局部结构或类中可以访问的内容也有一些限制,所以也要记住这一点。

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

最新更新