当您在类方法中声明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
关系,或者它只是一个实用程序结构。你也应该考虑设计方面的问题。
另外,对于在局部结构或类中可以访问的内容也有一些限制,所以也要记住这一点。
在您的示例中,对象是在堆栈上分配的,并调用默认构造函数