在initializer_list后面存储"隐藏数组"

Sha*_*ane 7 c++ gcc clang visual-c++ c++11

在C++ 11标准中,有一个关于支持统一初始化的数组的说明,其中指出:

如果可以如此分配具有相同初始化程序的显式数组,则实现可以在只读存储器中自由分配数组.

GCC/Clang/VS会利用这个吗?或者使用此功能的每个初始化是否受到堆栈上的其他数据的影响,以及此隐藏阵列的额外初始化时间?

例如,给出以下示例:

void function()
{
    std::vector<std::string> values = { "First", "Second" };
...
Run Code Online (Sandbox Code Playgroud)

上面提到的每个编译器是否将后备数组存储在与声明的变量相同的内存中的统一初始化中static const?当调用函数或应用程序初始化时,每个编译器是否会初始化后备数组?(我不是在谈论std::initializer_list<std::string>将要创建的,而是它所指的"隐藏数组".

Mar*_* Ba -2

首先:VC++,从版本 VS11=VS2012 开始,其初始版本不支持初始化列表,所以这个问题对于 VS atm 来说有点没有意义。但我确信他们会修补这个问题,它应该变成几个月(或几年)内相关。

作为附加信息,我将添加 VS 2012 对本地数组初始化所做的操作,每个人都可以得出自己的结论,这对于他们实现初始化列表时意味着什么:

release mode以下是 VC++2012 在编译器默认情况下输出的内置数组的初始化:

int _tmain(int argc, _TCHAR* argv[])
{
00B91002  in          al,dx  
00B91003  sub         esp,28h  
00B91006  mov         eax,dword ptr ds:[00B94018h]  
00B9100B  xor         eax,ebp  
00B9100D  mov         dword ptr [ebp-4],eax  
00B91010  push        esi  
    int numbers[] = {1,2,3,4,5,6,7,8,9};
00B91011  mov         dword ptr [numbers],1  
00B91018  mov         dword ptr [ebp-24h],2  
00B9101F  mov         dword ptr [ebp-20h],3  
00B91026  mov         dword ptr [ebp-1Ch],4  
00B9102D  mov         dword ptr [ebp-18h],5  
00B91034  mov         dword ptr [ebp-14h],6  
00B9103B  mov         dword ptr [ebp-10h],7  
00B91042  mov         dword ptr [ebp-0Ch],8  
00B91049  mov         dword ptr [ebp-8],9  

...
Run Code Online (Sandbox Code Playgroud)

因此,该数组是在函数执行时创建/填充的,因此不涉及“静态”存储。