当你在类方法中声明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};
?
尝试确定将结构设置为类成员还是将其作为本地方法更好,因为该方法经常被调用并且需要尽可能快。
答案 0 :(得分:4)
是否像其他任何本地数据(int,double等)一样在堆栈上分配,或者是一个默认构造函数调用和堆上分配的内存?
它分配在本地存储(堆栈)上
只有在创建运算符的任何new
版本(可能是新的位置)时才会在Freestore(堆)上创建对象。
此外,您的结构对象不会超出包含它的函数的范围。 Freestore(Heap)对象将持续存在,直到您明确地调用delete。
每当您创建结构/类的对象时,将为该结构/类调用适当的构造函数(通过匹配参数类型)。在您的情况下,您在创建对象时不传递任何参数,因此将调用Default构造函数。
如果struct初始化如此:struct timeval a = {0,0};
它仍然被分配为具有本地存储的对象。
尝试确定将结构设置为类成员还是将其作为本地方法更好,因为该方法经常被调用并且需要尽可能快。
在本地存储(堆栈)上创建对象比在Freestore(堆栈)上创建对象更快。 但是,在你的情况下,你根本就没有使用堆。
示例代码的实际分析应告诉您哪一个(本地结构或类成员)更适合您的性能要求。
但是,在将结构作为成员之前,请考虑结构与您的类的关系。它是否与您的班级有has a
关系,或者它只是一个公用事业结构。你也应该考虑这个设计方面。
此外,在本地结构或类中可以访问的内容中有 several restrictions ,所以请记住这一点。
答案 1 :(得分:1)
在您的示例中,对象在堆栈上分配,并调用默认构造函数。