【发布时间】:2016-07-04 21:58:03
【问题描述】:
我有一个带有数组的简单结构:
struct A
{
uint32_t arr[size];
};
我有两个函数,使用默认初始化和值初始化创建它:
template<class T>
void testDefault()
{
T* pa = new T; // Default
use(*pa);
delete pa;
}
template<class T>
void testValue()
{
T* pa = new T(); // Value
use(*pa);
delete pa;
}
我面临着这些功能的不同性能。有趣的是,性能差异取决于我如何声明结构的默认构造函数。我有三种方式:
struct A
{
uint32_t arr[size];
// Implicit constructor
};
struct B
{
uint32_t arr[size];
B() {}; // Empty constructor
};
struct C
{
uint32_t arr[size];
C() = default; // Defaulted constructor
};
我认为从编译器的角度来看它们都是一样的。我从来没有这么错。我确实使用结构A、B 和C 运行了testDefault() 和testValue() 多次并测量了性能。这是我所拥有的:
Default initialization (implict constructor) done in 880ms
Value initialization (implict constructor) done in 1145ms
Default initialization (empty constructor) done in 867ms
Value initialization (empty constructor) done in 865ms
Default initialization (defaulted constructor) done in 872ms
Value initialization (defaulted constructor) done in 1148ms
请注意,对于隐式和默认构造函数,性能显然更差。对于两种不同的初始化形式,只有空构造函数正确显示相同的性能。
我用 VC++、gcc 和 clang 对此进行了测试。见online demo for gcc。时间安排相当持久。
我的假设是:
- UDT 的默认值和值初始化是一回事
- 定义默认构造函数的所有演示方法都在做同样的事情
- 这些结构的默认构造函数应该使数组的内容处于不确定状态
由于所有编译器都表现出相同的时序,我似乎遗漏了一些东西。谁能解释一下这些时间?
(另请参阅我关于同一主题的问题Why compilers put zeros into arrays while they do not have to?。我在那里提供了一些指向 cppreference 的链接。)
【问题讨论】:
标签: c++ arrays initialization