方法局部结构是否需要执行默认构造函数
Does a method local structure require executing the default constructor
当您在类方法中声明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
关系,或者它只是一个实用程序结构。你也应该考虑设计方面的问题。
另外,对于在局部结构或类中可以访问的内容也有一些限制,所以也要记住这一点。
在您的示例中,对象是在堆栈上分配的,并调用默认构造函数
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 这将执行默认移动操作吗?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- make_shared是否对每个成员变量执行默认初始化(零初始化)
- 如果默认构造函数不执行任何操作,则目的是什么
- 执行默认值:在C 中的开关案例选择语句中
- 在集合上运行的函数模板,该集合具有默认的"transform"函数,该函数不执行任何操作
- 当用户将列表视图项拖动到其滚动条上时,执行默认滚动行为
- 始终执行默认切换语句
- 模板类=默认类不执行任何操作
- 是否可以使函数模板对不适当的类型而不是错误执行默认操作
- 在没有默认构造函数的OpenMP中,每个线程执行一次代码
- 方法局部结构是否需要执行默认构造函数